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 + -
显示快捷键?