standarddrawingview.java
来自「JHotDraw学习过程中对数组的测试程序haha 学习过程中对数组的测试程序」· Java 代码 · 共 686 行 · 第 1/2 页
JAVA
686 行
while (k.hasMoreElements()) { handle = (Handle) k.nextElement(); if (handle.containsPoint(x, y)) return handle; } return null; } /** * Informs that the current selection changed. * By default this event is forwarded to the * drawing editor. */ protected void selectionChanged() { fEditor.selectionChanged(this); } /** * Gets the position of the last click inside the view. */ public Point lastClick() { return fLastClick; } /** * Sets the grid spacing that is used to constrain points. */ public void setConstrainer(PointConstrainer c) { fConstrainer = c; } /** * Gets the current constrainer. */ public PointConstrainer getConstrainer() { return fConstrainer; } /** * Constrains a point to the current grid. */ protected Point constrainPoint(Point p) { // constrin to view size Dimension size = getSize(); //p.x = Math.min(size.width, Math.max(1, p.x)); //p.y = Math.min(size.height, Math.max(1, p.y)); p.x = Geom.range(1, size.width, p.x); p.y = Geom.range(1, size.height, p.y); if (fConstrainer != null ) return fConstrainer.constrainPoint(p); return p; } /** * Handles mouse down events. The event is delegated to the * currently active tool. * @return whether the event was handled. */ public void mousePressed(MouseEvent e) { requestFocus(); // JDK1.1 Point p = constrainPoint(new Point(e.getX(), e.getY())); fLastClick = new Point(e.getX(), e.getY()); tool().mouseDown(e, p.x, p.y); checkDamage(); } /** * Handles mouse drag events. The event is delegated to the * currently active tool. * @return whether the event was handled. */ public void mouseDragged(MouseEvent e) { Point p = constrainPoint(new Point(e.getX(), e.getY())); tool().mouseDrag(e, p.x, p.y); checkDamage(); } /** * Handles mouse move events. The event is delegated to the * currently active tool. * @return whether the event was handled. */ public void mouseMoved(MouseEvent e) { tool().mouseMove(e, e.getX(), e.getY()); } /** * Handles mouse up events. The event is delegated to the * currently active tool. * @return whether the event was handled. */ public void mouseReleased(MouseEvent e) { Point p = constrainPoint(new Point(e.getX(), e.getY())); tool().mouseUp(e, p.x, p.y); checkDamage(); } /** * Handles key down events. Cursor keys are handled * by the view the other key events are delegated to the * currently active tool. * @return whether the event was handled. */ public void keyPressed(KeyEvent e) { int code = e.getKeyCode(); if ((code == KeyEvent.VK_BACK_SPACE) || (code == KeyEvent.VK_DELETE)) { Command cmd = new DeleteCommand("Delete", this); cmd.execute(); } else if (code == KeyEvent.VK_DOWN || code == KeyEvent.VK_UP || code == KeyEvent.VK_RIGHT || code == KeyEvent.VK_LEFT) { handleCursorKey(code); } else { tool().keyDown(e, code); } checkDamage(); } /** * Handles cursor keys by moving all the selected figures * one grid point in the cursor direction. */ protected void handleCursorKey(int key) { int dx = 0, dy = 0; int stepX = 1, stepY = 1; // should consider Null Object. if (fConstrainer != null) { stepX = fConstrainer.getStepX(); stepY = fConstrainer.getStepY(); } switch (key) { case KeyEvent.VK_DOWN: dy = stepY; break; case KeyEvent.VK_UP: dy = -stepY; break; case KeyEvent.VK_RIGHT: dx = stepX; break; case KeyEvent.VK_LEFT: dx = -stepX; break; } moveSelection(dx, dy); } private void moveSelection(int dx, int dy) { FigureEnumeration figures = selectionElements(); while (figures.hasMoreElements()) figures.nextFigure().moveBy(dx, dy); checkDamage(); } /** * Refreshes the drawing if there is some accumulated damage */ public synchronized void checkDamage() { Enumeration each = drawing().drawingChangeListeners(); while (each.hasMoreElements()) { Object l = each.nextElement(); if (l instanceof DrawingView) { ((DrawingView)l).repairDamage(); } } } public void repairDamage() { if (fDamage != null) { repaint(fDamage.x, fDamage.y, fDamage.width, fDamage.height); fDamage = null; } } public void drawingInvalidated(DrawingChangeEvent e) { Rectangle r = e.getInvalidatedRectangle(); if (fDamage == null) fDamage = r; else fDamage.add(r); } public void drawingRequestUpdate(DrawingChangeEvent e) { repairDamage(); } /** * Updates the drawing view. */ public void update(Graphics g) { paint(g); } /** * Paints the drawing view. The actual drawing is delegated to * the current update strategy. * @see Painter */ public void paint(Graphics g) { fUpdateStrategy.draw(g, this); } /** * Draws the contents of the drawing view. * The view has three layers: background, drawing, handles. * The layers are drawn in back to front order. */ public void drawAll(Graphics g) { boolean isPrinting = g instanceof PrintGraphics; drawBackground(g); if (fBackgrounds != null && !isPrinting) drawPainters(g, fBackgrounds); drawDrawing(g); if (fForegrounds != null && !isPrinting) drawPainters(g, fForegrounds); if (!isPrinting) drawHandles(g); } /** * Draws the currently active handles. */ public void drawHandles(Graphics g) { Enumeration k = selectionHandles(); while (k.hasMoreElements()) ((Handle) k.nextElement()).draw(g); } /** * Draws the drawing. */ public void drawDrawing(Graphics g) { fDrawing.draw(g); } /** * Draws the background. If a background pattern is set it * is used to fill the background. Otherwise the background * is filled in the background color. */ public void drawBackground(Graphics g) { g.setColor(getBackground()); g.fillRect(0, 0, getBounds().width, getBounds().height); } private void drawPainters(Graphics g, Vector v) { for (int i = 0; i < v.size(); i++) ((Painter)v.elementAt(i)).draw(g, this); } /** * Adds a background. */ public void addBackground(Painter painter) { if (fBackgrounds == null) fBackgrounds = new Vector(3); fBackgrounds.addElement(painter); repaint(); } /** * Removes a background. */ public void removeBackground(Painter painter) { if (fBackgrounds != null) fBackgrounds.removeElement(painter); repaint(); } /** * Removes a foreground. */ public void removeForeground(Painter painter) { if (fForegrounds != null) fForegrounds.removeElement(painter); repaint(); } /** * Adds a foreground. */ public void addForeground(Painter painter) { if (fForegrounds == null) fForegrounds = new Vector(3); fForegrounds.addElement(painter); repaint(); } /** * Freezes the view by acquiring the drawing lock. * @see Drawing#lock */ public void freezeView() { drawing().lock(); } /** * Unfreezes the view by releasing the drawing lock. * @see Drawing#unlock */ public void unfreezeView() { drawing().unlock(); } private void readObject(ObjectInputStream s) throws ClassNotFoundException, IOException { s.defaultReadObject(); fSelection = new Vector(); // could use lazy initialization instead if (fDrawing != null) fDrawing.addDrawingChangeListener(this); } private void checkMinimumSize() { FigureEnumeration k = drawing().figures(); Dimension d = new Dimension(0, 0); while (k.hasMoreElements()) { Rectangle r = k.nextFigure().displayBox(); d.width = Math.max(d.width, r.x+r.width); d.height = Math.max(d.height, r.y+r.height); } if (fViewSize.height < d.height || fViewSize.width < d.width) { fViewSize.height = d.height+10; fViewSize.width = d.width+10; setSize(fViewSize); } } public boolean isFocusTraversable() { return true; } // listener methods we are not interested in public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseClicked(MouseEvent e) {} public void keyTyped(KeyEvent e) {} public void keyReleased(KeyEvent e) {}}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?