控制台程序。
工具栏在应用程序窗口中通常位于内容面板顶部的菜单栏下,包含直接访问菜单选项的按钮。在Sketcher程序中可以为最常用的菜单项添加工具栏。
工具栏是javax.swing.JToolBar类定义的Swing组件。想SketcherFrame类定义中添加如下域,可以为这个类添加一个用于工具栏的成员:
private JToolBar toolBar = new JToolBar();
为了把工具栏添加到应用程序窗口中,需要在SkecherFrame构造函数已有代码的后面添加如下语句:
getContentPane().add(toolBar,BorderLayout.NORTH);
对图标的引用一般存储在javax.swing.Icon类型的变量中,javax.swing.Icon是接口,其中声明的方法getHeight()和getWidth()分别用来返回图标的高度和宽度(以像素为单位)。Icon接口还声明了paint()方法,用来在组件上绘制图标图像。javax.swing.ImageIcon类实现了Icon接口,使用这个类在程序中通过包含定义图标图像数据的文件来创建图标对象。
ImageIcon类有多个构造函数,这里使用的构造函数仅仅接收一个String参数,这个参数指定了包含图标图像的文件的路径。传送为参数的String对象可以只是文件名,此时文件应位于Sketcher执行时的当前目录下。
在自定义包中指定图标文件的路径:
1 // Defines application wide constants 2 package Constants; 3 import java.awt.Color; 4 import javax.swing.*; 5 6 public class SketcherConstants { 7 // Path for images 8 public final static String imagePath = "E:/JavaProject/BeginningJava/Images/"; 9 10 // Toolbar icons 11 public final static Icon NEW24 = new ImageIcon(imagePath + "New24.gif"); 12 public final static Icon OPEN24 = new ImageIcon(imagePath + "Open24.gif"); 13 public final static Icon SAVE24 = new ImageIcon(imagePath + "Save24.gif"); 14 public final static Icon SAVEAS24 = new ImageIcon(imagePath + "SaveAs24.gif"); 15 public final static Icon PRINT24 = new ImageIcon(imagePath + "Print24.gif"); 16 17 // Element type definitions 18 public final static int LINE = 101; 19 public final static int RECTANGLE = 102; 20 public final static int CIRCLE = 103; 21 public final static int CURVE = 104; 22 23 // Initial conditions 24 public final static int DEFAULT_ELEMENT_TYPE = LINE; 25 public final static Color DEFAULT_ELEMENT_COLOR = Color.BLUE; 26 }
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.AWTEvent.*; 9 import static java.awt.Color.*; 10 import static Constants.SketcherConstants.*; 11 import static javax.swing.Action.*; 12 13 @SuppressWarnings("serial") 14 public class SketcherFrame extends JFrame { 15 // Constructor 16 public SketcherFrame(String title) { 17 setTitle(title); // Set the window title 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); 27 } 28 29 // Create File menu item actions 30 private void createFileMenuActions() { 31 newAction = new FileAction("New", 'N', CTRL_DOWN_MASK); 32 openAction = new FileAction("Open", 'O', CTRL_DOWN_MASK); 33 closeAction = new FileAction("Close"); 34 saveAction = new FileAction("Save", 'S', CTRL_DOWN_MASK); 35 saveAsAction = new FileAction("Save As..."); 36 printAction = new FileAction("Print", 'P', CTRL_DOWN_MASK); 37 exitAction = new FileAction("Exit", 'X', CTRL_DOWN_MASK); 38 39 // Initialize the array 40 FileAction[] actions = {openAction, closeAction, saveAction, saveAsAction, printAction, exitAction}; 41 fileActions = actions; 42 43 // Add toolbar icons 44 newAction.putValue(LARGE_ICON_KEY, NEW24); 45 openAction.putValue(LARGE_ICON_KEY, OPEN24); 46 saveAction.putValue(LARGE_ICON_KEY, SAVE24); 47 saveAsAction.putValue(LARGE_ICON_KEY, SAVEAS24); 48 printAction.putValue(LARGE_ICON_KEY, PRINT24); 49 } 50 51 // Create the File menu 52 private void createFileMenu() { 53 JMenu fileMenu = new JMenu("File"); // Create File menu 54 fileMenu.setMnemonic('F'); // Create shortcut 55 createFileMenuActions(); // Create Actions for File menu item 56 57 // Construct the file drop-down menu 58 fileMenu.add(newAction); // New Sketch menu item 59 fileMenu.add(openAction); // Open sketch menu item 60 fileMenu.add(closeAction); // Close sketch menu item 61 fileMenu.addSeparator(); // Add separator 62 fileMenu.add(saveAction); // Save sketch to file 63 fileMenu.add(saveAsAction); // Save As menu item 64 fileMenu.addSeparator(); // Add separator 65 fileMenu.add(printAction); // Print sketch menu item 66 fileMenu.addSeparator(); // Add separator 67 fileMenu.add(exitAction); // Print sketch menu item 68 menuBar.add(fileMenu); // Add the file menu 69 } 70 71 // Create Element menu actions 72 private void createElementTypeActions() { 73 lineAction = new TypeAction("Line", LINE, 'L', CTRL_DOWN_MASK); 74 rectangleAction = new TypeAction("Rectangle", RECTANGLE, 'R', CTRL_DOWN_MASK); 75 circleAction = new TypeAction("Circle", CIRCLE,'C', CTRL_DOWN_MASK); 76 curveAction = new TypeAction("Curve", CURVE,'U', CTRL_DOWN_MASK); 77 78 // Initialize the array 79 TypeAction[] actions = {lineAction, rectangleAction, circleAction, curveAction}; 80 typeActions = actions; 81 } 82 83 // Create the Elements menu 84 private void createElementMenu() { 85 createElementTypeActions(); 86 JMenu elementMenu = new JMenu("Elements"); // Create Elements menu 87 elementMenu.setMnemonic('E'); // Create shortcut 88 createRadioButtonDropDown(elementMenu, typeActions, lineAction); 89 menuBar.add(elementMenu); // Add the element menu 90 } 91 92 // Create Color menu actions 93 private void createElementColorActions() { 94 redAction = new ColorAction("Red", RED, 'R', CTRL_DOWN_MASK|ALT_DOWN_MASK); 95 yellowAction = new ColorAction("Yellow", YELLOW, 'Y', CTRL_DOWN_MASK|ALT_DOWN_MASK); 96 greenAction = new ColorAction("Green", GREEN, 'G', CTRL_DOWN_MASK|ALT_DOWN_MASK); 97 blueAction = new ColorAction("Blue", BLUE, 'B', CTRL_DOWN_MASK|ALT_DOWN_MASK); 98 99 // Initialize the array 100 ColorAction[] actions = {redAction, greenAction, blueAction, yellowAction}; 101 colorActions = actions; 102 } 103 104 // Create the Color menu 105 private void createColorMenu() { 106 createElementColorActions(); 107 JMenu colorMenu = new JMenu("Color"); // Create Elements menu 108 colorMenu.setMnemonic('C'); // Create shortcut 109 createRadioButtonDropDown(colorMenu, colorActions, blueAction); 110 menuBar.add(colorMenu); // Add the color menu 111 } 112 113 // Menu creation helper 114 private void createRadioButtonDropDown(JMenu menu, Action[] actions, Action selected) { 115 ButtonGroup group = new ButtonGroup(); 116 JRadioButtonMenuItem item = null; 117 for(Action action : actions) { 118 group.add(menu.add(item = new JRadioButtonMenuItem(action))); 119 if(action == selected) { 120 item.setSelected(true); // This is default selected 121 } 122 } 123 } 124 125 // Create toolbar buttons on the toolbar 126 private void createToolbar() { 127 for(FileAction action: fileActions){ 128 if(action != exitAction && action != closeAction) 129 addToolbarButton(action); // Add the toolbar button 130 } 131 } 132 133 // Create and add a toolbar button 134 private void addToolbarButton(Action action) { 135 JButton button = new JButton(action); // Create from Action 136 button.setBorder(BorderFactory.createCompoundBorder( // Add button border 137 new EmptyBorder(2,5,5,2), // Outside border 138 BorderFactory.createRaisedBevelBorder())); // Inside border 139 button.setHideActionText(true); // No label on the button 140 toolBar.add(button); // Add the toolbar button 141 } 142 143 // Inner class defining Action objects for File menu items 144 class FileAction extends AbstractAction { 145 // Create action with a name 146 FileAction(String name) { 147 super(name); 148 } 149 150 // Create action with a name and accelerator 151 FileAction(String name, char ch, int modifiers) { 152 super(name); 153 putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(ch, modifiers)); 154 155 // Now find the character to underline 156 int index = name.toUpperCase().indexOf(ch); 157 if(index != -1) { 158 putValue(DISPLAYED_MNEMONIC_INDEX_KEY, index); 159 } 160 } 161 162 // Event handler 163 public void actionPerformed(ActionEvent e) { 164 // You will add action code here eventually... 165 } 166 } 167 168 // Inner class defining Action objects for Element type menu items 169 class TypeAction extends AbstractAction { 170 // Create action with just a name property 171 TypeAction(String name, int typeID) { 172 super(name); 173 this.typeID = typeID; 174 } 175 176 // Create action with a name and an accelerator 177 private TypeAction(String name,int typeID, char ch, int modifiers) { 178 this(name, typeID); 179 putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(ch, modifiers)); 180 181 // Now find the character to underline 182 int index = name.toUpperCase().indexOf(ch); 183 if(index != -1) { 184 putValue(DISPLAYED_MNEMONIC_INDEX_KEY, index); 185 } 186 } 187 188 public void actionPerformed(ActionEvent e) { 189 elementType = typeID; 190 } 191 192 private int typeID; 193 } 194 195 // Handles color menu items 196 class ColorAction extends AbstractAction { 197 // Create an action with a name and a color 198 public ColorAction(String name, Color color) { 199 super(name); 200 this.color = color; 201 } 202 203 // Create an action with a name, a color, and an accelerator 204 public ColorAction(String name, Color color, char ch, int modifiers) { 205 this(name, color); 206 putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(ch, modifiers)); 207 208 // Now find the character to underline 209 int index = name.toUpperCase().indexOf(ch); 210 if(index != -1) { 211 putValue(DISPLAYED_MNEMONIC_INDEX_KEY, index); 212 } 213 } 214 215 public void actionPerformed(ActionEvent e) { 216 elementColor = color; 217 } 218 219 private Color color; 220 } 221 222 // File actions 223 private FileAction newAction, openAction, closeAction, saveAction, saveAsAction, printAction, exitAction; 224 private FileAction[] fileActions; // File actions as an array 225 226 // Element type actions 227 private TypeAction lineAction, rectangleAction, circleAction, curveAction; 228 private TypeAction[] typeActions; // Type actions as an array 229 230 // Element color actions 231 private ColorAction redAction, yellowAction,greenAction, blueAction; 232 private ColorAction[] colorActions; // Color actions as an array 233 234 private JMenuBar menuBar = new JMenuBar(); // Window menu bar 235 private Color elementColor = DEFAULT_ELEMENT_COLOR; // Current element color 236 private int elementType = DEFAULT_ELEMENT_TYPE; // Current element type 237 private JToolBar toolBar = new JToolBar(); // Window toolbar 238 }
1 // Sketching application 2 import javax.swing.*; 3 import java.awt.*; 4 import java.awt.event.*; 5 6 public class Sketcher { 7 public static void main(String[] args) { 8 theApp = new Sketcher(); // Create the application object 9 SwingUtilities.invokeLater(new Runnable() { 10 public void run() { 11 theApp.createGUI(); // Call GUI creator 12 } 13 }); 14 } 15 16 // Method to create the application GUI 17 private void createGUI() { 18 window = new SketcherFrame("Sketcher"); // Create the app window 19 Toolkit theKit = window.getToolkit(); // Get the window toolkit 20 Dimension wndSize = theKit.getScreenSize(); // Get screen size 21 22 // Set the position to screen center & size to half screen size 23 window.setSize(wndSize.width/2, wndSize.height/2); // Set window size 24 window.setLocationRelativeTo(null); // Center window 25 26 window.addWindowListener(new WindowHandler()); // Add window listener 27 window.setVisible(true); 28 } 29 30 // Handler class for window events 31 class WindowHandler extends WindowAdapter { 32 // Handler for window closing event 33 @Override 34 public void windowClosing(WindowEvent e) { 35 // Code to be added here... 36 } 37 } 38 39 private SketcherFrame window; // The application window 40 private static Sketcher theApp; // The application object 41 }