• Java基础之扩展GUI——添加状态栏(Sketcher 1 with a status bar)


    控制台程序。

    为了显示各个应用程序参数的状态,并且将各个参数显示在各自的面板中,在应用程序窗口的底部添加状态栏是常见且非常方便的方式。

    定义状态栏时没有Swing类可用,所以必须自己建立StatusBar类。在理想情况下,应为一般目地的状态栏设计类,然后再针对Sketcher进行定制。但由于篇幅显示,这里采用简单方法说明如何设计专用语Sketcher的类。

     1 // Class defining a status bar
     2 import javax.swing.*;
     3 import java.awt.*;
     4 import javax.swing.border.BevelBorder;
     5 import static Constants.SketcherConstants.*;
     6 
     7 @SuppressWarnings("serial")
     8 class StatusBar extends JPanel {
     9   // Constructor
    10   public StatusBar() {
    11     setLayout(new FlowLayout(FlowLayout.LEFT, 10, 3));
    12     setBackground(Color.LIGHT_GRAY);
    13     setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
    14     setColorPane(DEFAULT_ELEMENT_COLOR);
    15     setTypePane(DEFAULT_ELEMENT_TYPE);
    16     add(colorPane);                                                    // Add color pane to status bar
    17     add(typePane);                                                     // Add type pane to status bar
    18   }
    19 
    20   // Set color pane contents
    21   public void setColorPane(Color color) {
    22     String text = null;                                                // Text for the color pane
    23     Icon icon = null;                                                  // Icon to be displayed
    24     if(color.equals(Color.RED)) {
    25       text = "RED";
    26       icon = RED16;
    27     } else if(color.equals(Color.YELLOW)) {
    28       text = "YELLOW";
    29       icon = YELLOW16;
    30     } else if(color.equals(Color.GREEN)) {
    31       text = "GREEN";
    32       icon = GREEN16;
    33     } else if(color.equals(Color.BLUE)) {
    34       text = "BLUE";
    35       icon = BLUE16;
    36     } else {
    37       text = "CUSTOM COLOR";
    38     }
    39     colorPane.setIcon(icon);
    40     colorPane.setText(text);                                           // Set the pane text
    41   }
    42 
    43   // Set type pane label
    44   public void setTypePane (int elementType) {
    45     String text = null;                                                // Text for the type pane
    46     switch(elementType) {
    47       case LINE:
    48         text = "LINE";
    49         break;
    50       case RECTANGLE:
    51         text = "RECTANGLE";
    52         break;
    53       case CIRCLE:
    54         text = "CIRCLE";
    55         break;
    56       case CURVE:
    57         text = "CURVE";
    58         break;
    59       default:
    60         assert false;
    61     }
    62     typePane.setText(text);                                            // Set the pane text
    63   }
    64 
    65   // Panes in the status bar
    66   private StatusPane colorPane = new StatusPane("BLUE", BLUE16);;
    67   private StatusPane typePane = new StatusPane("LINE");
    68 
    69   // Class defining a status bar pane
    70   class StatusPane extends JLabel {
    71     // Constructor - text only
    72     public StatusPane(String text) {
    73       super(text, LEFT);
    74       setupPane();
    75     }
    76 
    77     // Constructor - text with an icon
    78     public StatusPane(String text, Icon icon) {
    79       super(text, icon, LEFT);
    80       setupPane();
    81     }
    82 
    83     // Helper method for use by constructors
    84     private void setupPane() {
    85       setBackground(Color.LIGHT_GRAY);                                 // Set background color
    86       setForeground(Color.BLACK);                                      // Set foreground color
    87       setFont(paneFont);                                               // Set the fixed font
    88       setBorder(BorderFactory.createCompoundBorder(
    89         BorderFactory.createBevelBorder(BevelBorder.LOWERED),          // Outside border
    90         BorderFactory.createEmptyBorder(0,5,0,3)));                    // Inside border
    91       setPreferredSize(new Dimension(80,20));
    92     }
    93 
    94     // Font for pane text
    95     private Font paneFont = new Font("Serif", Font.PLAIN, 10);
    96   }
    97 }

    然后,在SketcherFrame类中添加对状态栏的定义:

      1 // Frame for the Sketcher application
      2 import javax.swing.*;
      3 import javax.swing.border.*;
      4 import java.awt.event.*;
      5 import java.awt.*;
      6 
      7 import static java.awt.event.InputEvent.*;
      8 import static java.awt.Color.*;
      9 import static Constants.SketcherConstants.*;
     10 import static javax.swing.Action.*;
     11 
     12 @SuppressWarnings("serial")
     13 public class SketcherFrame extends JFrame {
     14   // Constructor
     15   public SketcherFrame(String title, Sketcher theApp) {
     16     setTitle(title);                                                   // Set the window title
     17     this.theApp = theApp;                                              // Save app. object reference
     18     setJMenuBar(menuBar);                                              // Add the menu bar to the window
     19     setDefaultCloseOperation(EXIT_ON_CLOSE);                           // Default is exit the application
     20 
     21     createFileMenu();                                                  // Create the File menu
     22     createElementMenu();                                               // Create the element menu
     23     createColorMenu();                                                 // Create the element menu
     24     createToolbar();
     25     toolBar.setRollover(true);
     26     getContentPane().add(toolBar, BorderLayout.NORTH);                 // Add the toolbar
     27     getContentPane().add(statusBar, BorderLayout.SOUTH);               // Add the statusbar
     28   }
     29 
     30   // Create File menu item actions
     31   private void createFileMenuActions() {
     32     newAction = new FileAction("New", 'N', CTRL_DOWN_MASK);
     33     openAction = new FileAction("Open", 'O', CTRL_DOWN_MASK);
     34     closeAction = new FileAction("Close");
     35     saveAction = new FileAction("Save", 'S', CTRL_DOWN_MASK);
     36     saveAsAction = new FileAction("Save As...");
     37     printAction = new FileAction("Print", 'P', CTRL_DOWN_MASK);
     38     exitAction = new FileAction("Exit", 'X', CTRL_DOWN_MASK);
     39 
     40     // Initialize the array
     41     FileAction[] actions = {openAction, closeAction, saveAction, saveAsAction, printAction, exitAction};
     42     fileActions = actions;
     43 
     44     // Add toolbar icons
     45     newAction.putValue(LARGE_ICON_KEY, NEW24);
     46     openAction.putValue(LARGE_ICON_KEY, OPEN24);
     47     saveAction.putValue(LARGE_ICON_KEY, SAVE24);
     48     saveAsAction.putValue(LARGE_ICON_KEY, SAVEAS24);
     49     printAction.putValue(LARGE_ICON_KEY, PRINT24);
     50 
     51     // Add menu item icons
     52     newAction.putValue(SMALL_ICON, NEW16);
     53     openAction.putValue(SMALL_ICON, OPEN16);
     54     saveAction.putValue(SMALL_ICON, SAVE16);
     55     saveAsAction.putValue(SMALL_ICON,SAVEAS16);
     56     printAction.putValue(SMALL_ICON, PRINT16);
     57 
     58     // Add tooltip text
     59     newAction.putValue(SHORT_DESCRIPTION, "Create a new sketch");
     60     openAction.putValue(SHORT_DESCRIPTION, "Read a sketch from a file");
     61     closeAction.putValue(SHORT_DESCRIPTION, "Close the current sketch");
     62     saveAction.putValue(SHORT_DESCRIPTION, "Save the current sketch to file");
     63     saveAsAction.putValue(SHORT_DESCRIPTION, "Save the current sketch to a new file");
     64     printAction.putValue(SHORT_DESCRIPTION, "Print the current sketch");
     65     exitAction.putValue(SHORT_DESCRIPTION, "Exit Sketcher");
     66   }
     67 
     68   // Create the File menu
     69   private void createFileMenu() {
     70     JMenu fileMenu = new JMenu("File");                                // Create File menu
     71     fileMenu.setMnemonic('F');                                         // Create shortcut
     72     createFileMenuActions();                                           // Create Actions for File menu item
     73 
     74     // Construct the file drop-down menu
     75     fileMenu.add(newAction);                                           // New Sketch menu item
     76     fileMenu.add(openAction);                                          // Open sketch menu item
     77     fileMenu.add(closeAction);                                         // Close sketch menu item
     78     fileMenu.addSeparator();                                           // Add separator
     79     fileMenu.add(saveAction);                                          // Save sketch to file
     80     fileMenu.add(saveAsAction);                                        // Save As menu item
     81     fileMenu.addSeparator();                                           // Add separator
     82     fileMenu.add(printAction);                                         // Print sketch menu item
     83     fileMenu.addSeparator();                                           // Add separator
     84     fileMenu.add(exitAction);                                          // Print sketch menu item
     85     menuBar.add(fileMenu);                                             // Add the file menu
     86   }
     87 
     88   // Create Element  menu actions
     89   private void createElementTypeActions() {
     90     lineAction = new TypeAction("Line", LINE, 'L', CTRL_DOWN_MASK);
     91     rectangleAction = new TypeAction("Rectangle", RECTANGLE, 'R', CTRL_DOWN_MASK);
     92     circleAction =  new TypeAction("Circle", CIRCLE,'C', CTRL_DOWN_MASK);
     93     curveAction = new TypeAction("Curve", CURVE,'U', CTRL_DOWN_MASK);
     94 
     95     // Initialize the array
     96     TypeAction[] actions = {lineAction, rectangleAction, circleAction, curveAction};
     97     typeActions = actions;
     98 
     99     // Add toolbar icons
    100     lineAction.putValue(LARGE_ICON_KEY, LINE24);
    101     rectangleAction.putValue(LARGE_ICON_KEY, RECTANGLE24);
    102     circleAction.putValue(LARGE_ICON_KEY, CIRCLE24);
    103     curveAction.putValue(LARGE_ICON_KEY, CURVE24);
    104 
    105     // Add menu item icons
    106     lineAction.putValue(SMALL_ICON, LINE16);
    107     rectangleAction.putValue(SMALL_ICON, RECTANGLE16);
    108     circleAction.putValue(SMALL_ICON, CIRCLE16);
    109     curveAction.putValue(SMALL_ICON, CURVE16);
    110 
    111     // Add tooltip text
    112     lineAction.putValue(SHORT_DESCRIPTION, "Draw lines");
    113     rectangleAction.putValue(SHORT_DESCRIPTION, "Draw rectangles");
    114     circleAction.putValue(SHORT_DESCRIPTION, "Draw circles");
    115     curveAction.putValue(SHORT_DESCRIPTION, "Draw curves");
    116   }
    117 
    118   // Create the Elements menu
    119   private void createElementMenu() {
    120     createElementTypeActions();
    121     elementMenu = new JMenu("Elements");                               // Create Elements menu
    122     elementMenu.setMnemonic('E');                                      // Create shortcut
    123     createRadioButtonDropDown(elementMenu, typeActions, lineAction);
    124     menuBar.add(elementMenu);                                          // Add the element menu
    125   }
    126 
    127   // Create Color menu actions
    128   private void createElementColorActions() {
    129     redAction = new ColorAction("Red", RED, 'R', CTRL_DOWN_MASK|ALT_DOWN_MASK);
    130     yellowAction = new ColorAction("Yellow", YELLOW, 'Y', CTRL_DOWN_MASK|ALT_DOWN_MASK);
    131     greenAction = new ColorAction("Green", GREEN, 'G', CTRL_DOWN_MASK|ALT_DOWN_MASK);
    132     blueAction = new ColorAction("Blue", BLUE, 'B', CTRL_DOWN_MASK|ALT_DOWN_MASK);
    133 
    134     // Initialize the array
    135     ColorAction[] actions = {redAction, greenAction, blueAction, yellowAction};
    136     colorActions = actions;
    137 
    138     // Add toolbar icons
    139     redAction.putValue(LARGE_ICON_KEY, RED24);
    140     greenAction.putValue(LARGE_ICON_KEY, GREEN24);
    141     blueAction.putValue(LARGE_ICON_KEY, BLUE24);
    142     yellowAction.putValue(LARGE_ICON_KEY, YELLOW24);
    143 
    144     // Add menu item icons
    145     redAction.putValue(SMALL_ICON, RED16);
    146     greenAction.putValue(SMALL_ICON, GREEN16);
    147     blueAction.putValue(SMALL_ICON, BLUE16);
    148     yellowAction.putValue(SMALL_ICON, YELLOW16);
    149 
    150     // Add tooltip text
    151     redAction.putValue(SHORT_DESCRIPTION, "Draw in red");
    152     greenAction.putValue(SHORT_DESCRIPTION, "Draw in green");
    153     blueAction.putValue(SHORT_DESCRIPTION, "Draw in blue");
    154     yellowAction.putValue(SHORT_DESCRIPTION, "Draw in yellow");
    155   }
    156 
    157   // Create the Color menu
    158   private void createColorMenu() {
    159     createElementColorActions();
    160     colorMenu = new JMenu("Color");                                    // Create Elements menu
    161     colorMenu.setMnemonic('C');                                        // Create shortcut
    162     createRadioButtonDropDown(colorMenu, colorActions, blueAction);
    163     menuBar.add(colorMenu);                                            // Add the color menu
    164   }
    165 
    166   // Menu creation helper
    167   private void createRadioButtonDropDown(JMenu menu, Action[] actions, Action selected) {
    168     ButtonGroup group = new ButtonGroup();
    169     JRadioButtonMenuItem item = null;
    170     for(Action action : actions) {
    171       group.add(menu.add(item = new JRadioButtonMenuItem(action)));
    172       if(action == selected) {
    173         item.setSelected(true);                                        // This is default selected
    174       }
    175     }
    176   }
    177 
    178   // Create toolbar buttons on the toolbar
    179   private void createToolbar() {
    180     for(FileAction action: fileActions){
    181       if(action != exitAction && action != closeAction)
    182         addToolbarButton(action);                                      // Add the toolbar button
    183     }
    184     toolBar.addSeparator();
    185 
    186     // Create Color menu buttons
    187     for(ColorAction action:colorActions){
    188         addToolbarButton(action);                                      // Add the toolbar button
    189     }
    190 
    191     toolBar.addSeparator();
    192 
    193     // Create Elements menu buttons
    194     for(TypeAction action:typeActions){
    195         addToolbarButton(action);                                      // Add the toolbar button
    196     }
    197  }
    198 
    199   // Create and add a toolbar button
    200   private void addToolbarButton(Action action) {
    201     JButton button = new JButton(action);                              // Create from Action
    202     button.setBorder(BorderFactory.createCompoundBorder(               // Add button border
    203            new EmptyBorder(2,5,5,2),                                   // Outside border
    204            BorderFactory.createRaisedBevelBorder()));                  // Inside border
    205     button.setHideActionText(true);                                    // No label on the button
    206     toolBar.add(button);                                               // Add the toolbar button
    207   }
    208 
    209   // Return the current drawing color
    210   public Color getElementColor() {
    211     return elementColor;
    212   }
    213 
    214   // Return the current element type
    215   public int getElementType() {
    216     return elementType;
    217   }
    218 
    219   // Set radio button menu checks
    220   private void setChecks(JMenu menu, Object eventSource) {
    221     if(eventSource instanceof JButton){
    222       JButton button = (JButton)eventSource;
    223       Action action = button.getAction();
    224       for(int i = 0 ; i<menu.getItemCount() ; ++i) {
    225         JMenuItem item = menu.getItem(i);
    226         item.setSelected(item.getAction() == action);
    227       }
    228     }
    229   }
    230 
    231   // Inner class defining Action objects for File menu items
    232   class FileAction extends AbstractAction {
    233     // Create action with a name
    234     FileAction(String name) {
    235       super(name);
    236     }
    237 
    238     // Create action with a name and accelerator
    239     FileAction(String name, char ch, int modifiers) {
    240       super(name);
    241       putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(ch, modifiers));
    242 
    243       // Now find the character to underline
    244       int index = name.toUpperCase().indexOf(ch);
    245       if(index != -1) {
    246         putValue(DISPLAYED_MNEMONIC_INDEX_KEY, index);
    247       }
    248     }
    249 
    250     // Event handler
    251     public void actionPerformed(ActionEvent e) {
    252       // You will add action code here eventually...
    253     }
    254   }
    255 
    256   // Inner class defining Action objects for Element type menu items
    257   class TypeAction extends AbstractAction {
    258     // Create action with just a name property
    259     TypeAction(String name, int typeID) {
    260       super(name);
    261       this.typeID = typeID;
    262     }
    263 
    264     // Create action with a name and an accelerator
    265     private TypeAction(String name,int typeID, char ch, int modifiers) {
    266       this(name, typeID);
    267       putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(ch, modifiers));
    268 
    269       // Now find the character to underline
    270       int index = name.toUpperCase().indexOf(ch);
    271       if(index != -1) {
    272         putValue(DISPLAYED_MNEMONIC_INDEX_KEY, index);
    273       }
    274     }
    275 
    276     public void actionPerformed(ActionEvent e) {
    277       elementType = typeID;
    278       setChecks(elementMenu, e.getSource());
    279       statusBar.setTypePane(typeID);
    280     }
    281 
    282     private int typeID;
    283   }
    284 
    285   // Handles color menu items
    286   class ColorAction  extends AbstractAction {
    287     // Create an action with a name and a color
    288     public ColorAction(String name, Color color) {
    289       super(name);
    290       this.color = color;
    291     }
    292 
    293     // Create an action with a name, a color, and an accelerator
    294     public ColorAction(String name, Color color, char ch, int modifiers) {
    295       this(name, color);
    296       putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(ch, modifiers));
    297 
    298       // Now find the character to underline
    299       int index = name.toUpperCase().indexOf(ch);
    300       if(index != -1) {
    301         putValue(DISPLAYED_MNEMONIC_INDEX_KEY, index);
    302       }
    303     }
    304 
    305     public void actionPerformed(ActionEvent e) {
    306       elementColor = color;
    307       setChecks(colorMenu, e.getSource());
    308       statusBar.setColorPane(color);
    309     }
    310 
    311     private Color color;
    312   }
    313 
    314   // File actions
    315   private FileAction newAction, openAction, closeAction, saveAction, saveAsAction, printAction, exitAction;
    316   private FileAction[] fileActions;                                    // File actions as an array
    317 
    318   // Element type actions
    319   private TypeAction lineAction, rectangleAction, circleAction, curveAction;
    320   private TypeAction[] typeActions;                                    // Type actions as an array
    321 
    322 // Element color actions
    323   private ColorAction redAction, yellowAction,greenAction, blueAction;
    324   private ColorAction[] colorActions;                                  // Color actions as an array
    325 
    326   private JMenuBar menuBar = new JMenuBar();                           // Window menu bar
    327   private JMenu elementMenu;                                           // Elements menu
    328   private JMenu colorMenu;                                             // Color menu
    329   private StatusBar statusBar = new StatusBar();                       // Window status bar
    330 
    331   private Color elementColor = DEFAULT_ELEMENT_COLOR;                  // Current element color
    332   private int elementType = DEFAULT_ELEMENT_TYPE;                      // Current element type
    333   private JToolBar toolBar = new JToolBar();                           // Window toolbar
    334   private Sketcher theApp;                                             // The application object
    335 }
    View Code

    其他与上一例同。

  • 相关阅读:
    axios的全局配置
    Vue:vue-router编程式导航
    【spring源码系列】之【Bean的属性赋值】
    【spring源码系列】之【Bean的实例化】
    【spring源码系列】之【Bean的生命周期】
    【spring源码系列】之【BeanDefinition】
    【spring源码系列】之【xml解析】
    【spring源码系列】之【环境搭建】
    mysql去重
    Nacos 服务推送和发现
  • 原文地址:https://www.cnblogs.com/mannixiang/p/3494935.html
Copyright © 2020-2023  润新知