Java基础之在窗口中绘图——利用多态性使用鼠标自由绘图(Sketcher 7 with a crosshair cursor)

作者: mannixiang
发布时间:2015-07-06 18:00:30

控制台程序。

在Sketcher中创建形状时,并不知道应该以什么顺序创建不同类型的形状,这完全取决于使用Sketcher程序生成草图的人。因此需要绘制形状,对它们执行其他操作而不必知道图形是什么。当然,多态性在这里是有帮助的。

最简单的方法可能是为Sketcher形状类定义通用的基类,并在每个形状类中包含一个成员来存储某种java.awt.geom形状对象,接着把对形状类对象的引用存储为基类类型以获得多态行为。

1、通用基类:

  1 import java.awt.*;    2 import java.io.Serializable;    3 import static Constants.SketcherConstants.*;    4 import java.awt.geom.*;    5     6 public abstract class Element implements Serializable{    7     8   public Element(Point position, Color color) {    9     this.position = new Point(position);   10     this.color = color;   11   }   12    13   protected Element(Color color) {   14     this.color = color;   15   }   16    17   // Returns the color of the element   18   public Color getColor() {   19     return color;   20   }   21    22   // Returns the position of the element   23   public Point getPosition() {   24     return position;   25   }   26    27   // Returns the bounding rectangle enclosing an element boundary   28   public java.awt.Rectangle getBounds() {   29     return bounds;   30   }   31    32   // Create a new element   33   public static Element createElement(int type, Color color, Point start, Point end) {   34     switch(type) {   35       case LINE:   36         return new Element.Line(start, end, color);   37       case RECTANGLE:   38          return new Rectangle(start, end, color);   39       case CIRCLE:   40         return new Circle(start, end, color);   41       case CURVE:   42         return new Curve(start, end, color);   43       default:   44        assert false;                                                   // We should never get to here   45     }   46     return null;   47   }   48    49   // Nested class defining a line   50   public static class Line extends Element {   51     public Line(Point start, Point end, Color color) {   52       super(start, color);   53       line = new Line2D.Double(origin.x, origin.y, end.x - position.x, end.y - position.y);   54       bounds = new java.awt.Rectangle(   55                      Math.min(start.x ,end.x),    Math.min(start.y, end.y),   56                      Math.abs(start.x - end.x)+1, Math.abs(start.y - end.y)+1);   57     }   58    59     // Change the end point for the line   60     public void modify(Point start, Point last) {   61       line.x2 = last.x - position.x;   62       line.y2 = last.y - position.y;   63       bounds = new java.awt.Rectangle(   64                    Math.min(start.x ,last.x),    Math.min(start.y, last.y),   65                    Math.abs(start.x - last.x)+1, Math.abs(start.y - last.y)+1);   66     }   67    68     // Display the line   69     public  void draw(Graphics2D g2D) {   70      g2D.setPaint(color);                                              // Set the line color   71      g2D.translate(position.x, position.y);                            // Move context origin   72      g2D.draw(line);                                                   // Draw the line   73      g2D.translate(-position.x, -position.y);                          // Move context origin back   74     }   75     private Line2D.Double line;   76     private final static long serialVersionUID = 1001L;   77   }   78    79   // Nested class defining a rectangle   80   public static class Rectangle extends Element {   81     public Rectangle(Point start, Point end, Color color) {   82       super(new Point(Math.min(start.x, end.x), Math.min(start.y, end.y)), color);   83       rectangle = new Rectangle2D.Double(   84         origin.x, origin.y,                                            // Top-left corner   85         Math.abs(start.x - end.x), Math.abs(start.y - end.y));         // Width & height   86       bounds = new java.awt.Rectangle(   87                     Math.min(start.x ,end.x),    Math.min(start.y, end.y),   88                     Math.abs(start.x - end.x)+1, Math.abs(start.y - end.y)+1);   89     }   90    91     // Display the rectangle   92     public  void draw(Graphics2D g2D) {   93       g2D.setPaint(color);                                             // Set the rectangle color   94       g2D.translate(position.x, position.y);                           // Move context origin   95       g2D.draw(rectangle);                                             // Draw the rectangle   96       g2D.translate(-position.x, -position.y);                         // Move context origin back   97     }   98    99     // Method to redefine the rectangle  100     public void modify(Point start, Point last) {  101       bounds.x = position.x = Math.min(start.x, last.x);  102       bounds.y = position.y = Math.min(start.y, last.y);  103       rectangle.width = Math.abs(start.x - last.x);  104       rectangle.height = Math.abs(start.y - last.y);  105       bounds.width = (int)rectangle.width +1;  106       bounds.height = (int)rectangle.height + 1;  107     }  108   109     private Rectangle2D.Double rectangle;  110     private final static long serialVersionUID = 1001L;  111   }  112   113   // Nested class defining a circle  114   public static class Circle extends Element {  115     public Circle(Point center, Point circum, Color color) {  116       super(color);  117   118       // Radius is distance from center to circumference  119       double radius = center.distance(circum);  120       position = new Point(center.x - (int)radius, center.y - (int)radius);  121       circle = new Ellipse2D.Double(origin.x, origin.y, 2.*radius, 2.*radius);  122       bounds = new java.awt.Rectangle(position.x, position.y,  123                               1 + (int)circle.width, 1+(int)circle.height);  124     }  125   126     // Display the circle  127     public  void draw(Graphics2D g2D) {  128       g2D.setPaint(color);                                             // Set the circle color  129       g2D.translate(position.x, position.y);                           // Move context origin  130       g2D.draw(circle);                                                // Draw the circle  131       g2D.translate(-position.x, -position.y);                         // Move context origin back  132     }  133   134     // Recreate this circle  135     public void modify(Point center, Point circum) {  136       double radius = center.distance(circum);  137       circle.width = circle.height = 2*radius;  138       position.x = center.x - (int)radius;  139       position.y = center.y - (int)radius;  140       bounds = new java.awt.Rectangle(position.x, position.y,  141                               1 + (int)circle.width, 1+(int)circle.height);  142     }  143   144     private Ellipse2D.Double circle;  145     private final static long serialVersionUID = 1001L;  146   }  147   148   // Nested class defining a curve  149   public static class Curve extends Element {  150     public Curve(Point start, Point next, Color color) {  151       super(start, color);  152       curve = new GeneralPath();  153       curve.moveTo(origin.x, origin.y);                                // Set current position as origin  154       curve.lineTo(next.x - position.x, next.y - position.y);          // Add segment  155       bounds = new java.awt.Rectangle(  156                    Math.min(start.x ,next.x),    Math.min(start.y, next.y),  157                    Math.abs(next.x - start.x)+1, Math.abs(next.y - start.y)+1);  158     }  159   160     // Add another segment  161     public void modify(Point start, Point next) {  162       curve.lineTo(next.x - position.x, next.y - position.y);          // Add segment  163       bounds.add(new java.awt.Rectangle(next.x,next.y, 1, 1));         // Extend bounds  164     }  165   166   167     // Display the curve  168     public  void draw(Graphics2D g2D) {  169      g2D.setPaint(color);                                              // Set the curve color  170      g2D.translate(position.x, position.y);                            // Move context origin  171      g2D.draw(curve);                                                  // Draw the curve  172      g2D.translate(-position.x, -position.y);                          // Move context origin back  173     }  174   175     private GeneralPath curve;  176     private final static long serialVersionUID = 1001L;  177   }  178   179   // Abstract Element class methods  180   public abstract void draw(Graphics2D g2D);  181   public abstract void modify(Point start, Point last);  182   183   // Element class fields  184   protected Point position;                                            // Position of a shape  185   protected Color color;                                               // Color of a shape  186   protected java.awt.Rectangle bounds;                                 // Bounding rectangle  187   protected static final Point origin = new Point();                   // Origin for elements  188   private final static long serialVersionUID = 1001L;  189 }
View Code

2、实现了链表和Iterable<Element>接口的模型:

 1 import java.io.Serializable;   2 import java.util.*;   3    4 public class SketcherModel extends Observable implements Serializable, Iterable<Element> {   5    6   //Remove an element from the sketch   7   public boolean remove(Element element) {   8     boolean removed = elements.remove(element);   9     if(removed) {  10       setChanged();  11       notifyObservers(element.getBounds());  12     }  13     return removed;  14   }  15   16   //Add an element to the sketch  17   public void add(Element element) {  18     elements.add(element);  19     setChanged();  20     notifyObservers(element.getBounds());  21   }  22   23   // Get iterator for sketch elements  24   public Iterator<Element> iterator() {  25     return elements.iterator();  26   }  27   28   29   protected LinkedList<Element> elements = new LinkedList<>();  30   private final static long serialVersionUID = 1001L;  31 }
View Code

3、视图:

 1 import javax.swing.JComponent;   2 import java.util.*;   3 import java.awt.*;   4 import java.awt.event.MouseEvent;   5 import javax.swing.event.MouseInputAdapter;   6    7 @SuppressWarnings("serial")   8 public class SketcherView extends JComponent implements Observer {   9   public SketcherView(Sketcher theApp) {  10     this.theApp = theApp;  11     MouseHandler handler = new MouseHandler();                         // create the mouse listener  12     addMouseListener(handler);                                         // Listen for button events  13     addMouseMotionListener(handler);                                   // Listen for motion events  14   }  15   16   // Method called by Observable object when it changes  17   public void update(Observable o, Object rectangle) {  18     if(rectangle != null) {  19       repaint((java.awt.Rectangle)rectangle);  20     } else {  21       repaint();  22     }  23   }  24   25   // Method to draw on the view  26   @Override  27   public void paint(Graphics g) {  28     Graphics2D g2D = (Graphics2D)g;                                    // Get a 2D device context  29     for(Element element: theApp.getModel()) {                          // For each element in the model  30       element.draw(g2D);                                               // ...draw the element  31     }  32   }  33   34   class MouseHandler extends MouseInputAdapter {  35     @Override  36     public void mousePressed(MouseEvent e)  {  37       start = e.getPoint();                                            // Save the cursor position in start  38       buttonState = e.getButton();                                     // Record which button was pressed  39       if(buttonState == MouseEvent.BUTTON1) {  40         g2D = (Graphics2D)getGraphics();                               // Get graphics context  41         g2D.setXORMode(getBackground());                               // Set XOR mode  42       }  43     }  44   45     @Override  46     public void mouseDragged(MouseEvent e) {  47       last = e.getPoint();                                             // Save cursor position  48   49       if(buttonState == MouseEvent.BUTTON1) {  50         if(tempElement == null) {                                      // Is there an element?  51           tempElement = Element.createElement(                         // No, so create one  52                                  theApp.getWindow().getElementType(),  53                                  theApp.getWindow().getElementColor(),  54                                  start, last);  55         } else {  56           tempElement.draw(g2D);                                       // Yes draw to erase it  57           tempElement.modify(start, last);                             // Now modify it  58         }  59         tempElement.draw(g2D);                                         // and draw it  60      }  61     }  62   63     @Override  64     public void mouseReleased(MouseEvent e) {  65       if(e.getButton() == MouseEvent.BUTTON1) {  66         buttonState = MouseEvent.NOBUTTON;                             // Reset the button state  67   68         if(tempElement != null) {                                      // If there is an element...  69           theApp.getModel().add(tempElement);                          // ...add it to the model...  70           tempElement = null;                                          // ...and reset the field  71         }  72         if(g2D != null) {                                              // If there's a graphics context  73           g2D.dispose();                                               // ...release the resource...  74           g2D = null;                                                  // ...and reset field to null  75         }  76         start = last = null;                                           // Remove any points  77       }  78     }  79   80     @Override  81     public void mouseEntered(MouseEvent e) {  82       setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));  83     }  84   85     @Override  86     public void mouseExited(MouseEvent e) {  87       setCursor(Cursor.getDefaultCursor());  88     }  89   90     private Point start;                                               // Stores cursor position on press  91     private Point last;                                                // Stores cursor position on drag  92     private Element tempElement = null;                                // Stores a temporary element  93     private int buttonState = MouseEvent.NOBUTTON;                     // Records button state  94     private Graphics2D g2D = null;                                     // Temporary graphics context  95    }  96   97   private Sketcher theApp;                                             // The application object  98 }
View Code

4、窗口框架:

  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, Sketcher theApp) {   17     setTitle(title);                                                   // Set the window title   18     this.theApp = theApp;                                              // Save app. object reference   19     setJMenuBar(menuBar);                                              // Add the menu bar to the window   20     setDefaultCloseOperation(EXIT_ON_CLOSE);                           // Default is exit the application   21    22     createFileMenu();                                                  // Create the File menu   23     createElementMenu();                                               // Create the element menu   24     createColorMenu();                                                 // Create the element menu   25     createToolbar();   26     toolBar.setRollover(true);   27     getContentPane().add(toolBar, BorderLayout.NORTH);   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     blueAction.putValue(SMALL_ICON, BLUE16);  147     greenAction.putValue(SMALL_ICON, GREEN16);  148     yellowAction.putValue(SMALL_ICON, YELLOW16);  149   150     // Add tooltip text  151     redAction.putValue(SHORT_DESCRIPTION, "Draw in red");  152     blueAction.putValue(SHORT_DESCRIPTION, "Draw in blue");  153     greenAction.putValue(SHORT_DESCRIPTION, "Draw in green");  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     }  280   281     private int typeID;  282   }  283   284   // Handles color menu items  285   class ColorAction  extends AbstractAction {  286     // Create an action with a name and a color  287     public ColorAction(String name, Color color) {  288       super(name);  289       this.color = color;  290     }  291   292     // Create an action with a name, a color, and an accelerator  293     public ColorAction(String name, Color color, char ch, int modifiers) {  294       this(name, color);  295       putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(ch, modifiers));  296   297       // Now find the character to underline  298       int index = name.toUpperCase().indexOf(ch);  299       if(index != -1) {  300         putValue(DISPLAYED_MNEMONIC_INDEX_KEY, index);  301       }  302     }  303   304     public void actionPerformed(ActionEvent e) {  305       elementColor = color;  306       setChecks(colorMenu, e.getSource());  307     }  308   309     private Color color;  310   }  311   312   // File actions  313   private FileAction newAction, openAction, closeAction, saveAction, saveAsAction, printAction, exitAction;  314   private FileAction[] fileActions;                                    // File actions as an array  315   316   // Element type actions  317   private TypeAction lineAction, rectangleAction, circleAction, curveAction;  318   private TypeAction[] typeActions;                                    // Type actions as an array  319   320 // Element color actions  321   private ColorAction redAction, yellowAction,greenAction, blueAction;  322   private ColorAction[] colorActions;                                  // Color actions as an array  323   324   private JMenuBar menuBar = new JMenuBar();                           // Window menu bar  325   private JMenu elementMenu;                                           // Elements menu  326   private JMenu colorMenu;                                             // Color menu  327   328   private Color elementColor = DEFAULT_ELEMENT_COLOR;                  // Current element color  329   private int elementType = DEFAULT_ELEMENT_TYPE;                      // Current element type  330   private JToolBar toolBar = new JToolBar();                           // Window toolbar  331   private Sketcher theApp;                                             // The application object  332 }
View Code

5、自定义常量包:

 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   public final static Icon LINE24 = new ImageIcon(imagePath + "Line24.gif");  18   public final static Icon RECTANGLE24 = new ImageIcon(imagePath + "Rectangle24.gif");  19   public final static Icon CIRCLE24 = new ImageIcon(imagePath + "Circle24.gif");  20   public final static Icon CURVE24 = new ImageIcon(imagePath + "Curve24.gif");  21   22   public final static Icon RED24 = new ImageIcon(imagePath + "Red24.gif");  23   public final static Icon GREEN24 = new ImageIcon(imagePath + "Green24.gif");  24   public final static Icon BLUE24 = new ImageIcon(imagePath + "Blue24.gif");  25   public final static Icon YELLOW24 = new ImageIcon(imagePath + "Yellow24.gif");  26   27   // Menu item icons  28   public final static Icon NEW16 = new ImageIcon(imagePath + "new16.gif");  29   public final static Icon OPEN16 = new ImageIcon(imagePath + "Open16.gif");  30   public final static Icon SAVE16 = new ImageIcon(imagePath + "Save16.gif");  31   public final static Icon SAVEAS16 = new ImageIcon(imagePath + "SaveAs16.gif");  32   public final static Icon PRINT16 = new ImageIcon(imagePath + "print16.gif");  33   34   public final static Icon LINE16 = new ImageIcon(imagePath + "Line16.gif");  35   public final static Icon RECTANGLE16 = new ImageIcon(imagePath + "Rectangle16.gif");  36   public final static Icon CIRCLE16 = new ImageIcon(imagePath + "Circle16.gif");  37   public final static Icon CURVE16 = new ImageIcon(imagePath + "Curve16.gif");  38   39   public final static Icon RED16 = new ImageIcon(imagePath + "Red16.gif");  40   public final static Icon GREEN16 = new ImageIcon(imagePath + "Green16.gif");  41   public final static Icon BLUE16 = new ImageIcon(imagePath + "Blue16.gif");  42   public final static Icon YELLOW16 = new ImageIcon(imagePath + "Yellow16.gif");  43   44   // Element type definitions  45   public final static int LINE      = 101;  46   public final static int RECTANGLE = 102;  47   public fi
                    

标签: Cursor Java Sketch SSH
来源:http://www.cnblogs.com/mannixiang/p/3489909.html

推荐: