mxrubberband.java
来自「经典的java图像处理程序源码」· Java 代码 · 共 346 行
JAVA
346 行
/** * $Id: mxRubberband.java,v 1.10 2009/03/20 08:56:46 gaudenz Exp $ * Copyright (c) 2008, Gaudenz Alder */package com.mxgraph.swing.handler;import java.awt.Color;import java.awt.Graphics;import java.awt.Point;import java.awt.Rectangle;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.awt.event.MouseMotionListener;import com.mxgraph.swing.mxGraphComponent;import com.mxgraph.swing.mxGraphComponent.mxGraphControl;import com.mxgraph.util.mxConstants;import com.mxgraph.util.mxEvent;import com.mxgraph.util.mxEventObject;import com.mxgraph.util.mxUtils;import com.mxgraph.util.mxEventSource.mxIEventListener;/** * Implements a rubberband selection. */public class mxRubberband implements MouseListener, MouseMotionListener{ /** * Specifies if the rubberband is enabled. */ protected boolean enabled = true; /** * Defines the border color for drawing the rubberband selection. * Default is mxConstants.RUBBERBAND_BORDERCOLOR. */ protected Color borderColor = mxConstants.RUBBERBAND_BORDERCOLOR; /** * Defines the color to be used for filling the rubberband selection. * Default is mxConstants.RUBBERBAND_FILLCOLOR. */ protected Color fillColor = mxConstants.RUBBERBAND_FILLCOLOR; /** * Reference to the enclosing graph container. */ protected mxGraphComponent graphComponent; /** * Holds the point where the selection has started. */ protected transient Point first; /** * Holds the current rubberband bounds. */ protected transient Rectangle bounds; /** * Constructs a new rubberband selection for the given graph component. * * @param graphComponent Component that contains the rubberband. */ public mxRubberband(final mxGraphComponent graphComponent) { this.graphComponent = graphComponent; // Adds the required listeners graphComponent.getGraphControl().addMouseListener(this); graphComponent.getGraphControl().addMouseMotionListener(this); graphComponent.addListener(mxEvent.AFTER_PAINT, new mxIEventListener() { public void invoke(Object source, mxEventObject evt) { paintRubberband((Graphics) evt.getArgAt(0)); } }); // Handles escape keystrokes graphComponent.addKeyListener(new KeyAdapter() { /** * * @param e * @return */ public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ESCAPE && graphComponent.isEscapeEnabled()) { reset(); } } }); // LATER: Add destroy method for removing above listeners } /** * Returns the enabled state. */ public boolean isEnabled() { return enabled; } /** * Sets the enabled state. */ public void setEnabled(boolean enabled) { this.enabled = enabled; } /** * Returns the border color. */ public Color getBorderColor() { return borderColor; } /** * Sets the border color. */ public void setBorderColor(Color value) { borderColor = value; } /** * Returns the fill color. */ public Color getFillColor() { return fillColor; } /** * Sets the fill color. */ public void setFillColor(Color value) { fillColor = value; } /** * Returns true if the given event should start the rubberband selection. */ public boolean isRubberbandTrigger(MouseEvent e) { return true; } /** * Starts the rubberband selection at the given point. */ public void start(Point point) { first = point; bounds = new Rectangle(first); } /** * Resets the rubberband selection without carrying out the selection. */ public void reset() { first = null; if (bounds != null) { graphComponent.getGraphControl().repaint(bounds); bounds = null; } } /** * * @param rect * @param e */ public Object[] select(Rectangle rect, MouseEvent e) { return graphComponent.selectRegion(rect, e); } /** * */ public void paintRubberband(Graphics g) { if (first != null && bounds != null && graphComponent.isSignificant(bounds.width, bounds.height)) { Rectangle rect = new Rectangle(bounds); g.setColor(fillColor); mxUtils.fillClippedRect(g, rect.x, rect.y, rect.width, rect.height); g.setColor(borderColor); rect.width -= 1; rect.height -= 1; g.drawRect(rect.x, rect.y, rect.width, rect.height); } } /** * */ public void mousePressed(MouseEvent e) { if (!e.isConsumed() && isEnabled() && isRubberbandTrigger(e) && !e.isPopupTrigger()) { start(e.getPoint()); e.consume(); } } /** * */ public void mouseDragged(MouseEvent e) { if (!e.isConsumed() && first != null) { Rectangle oldBounds = new Rectangle(bounds); bounds = new Rectangle(first); bounds.add(e.getPoint()); if (graphComponent.isSignificant(bounds.width, bounds.height)) { mxGraphControl control = graphComponent.getGraphControl(); // Repaints exact difference between old and new bounds Rectangle union = new Rectangle(oldBounds); union.add(bounds); if (bounds.x != oldBounds.x) { int maxleft = (int) Math.max(bounds.x, oldBounds.x); Rectangle tmp = new Rectangle(union.x - 1, union.y, maxleft - union.x + 2, union.height); control.repaint(tmp); } if (bounds.x + bounds.width != oldBounds.x + oldBounds.width) { int minright = (int) Math.min(bounds.x + bounds.width, oldBounds.x + oldBounds.width); Rectangle tmp = new Rectangle(minright - 1, union.y, union.x + union.width - minright + 1, union.height); control.repaint(tmp); } if (bounds.y != oldBounds.y) { int maxtop = (int) Math.max(bounds.y, oldBounds.y); Rectangle tmp = new Rectangle(union.x, union.y - 1, union.width, maxtop - union.y + 2); control.repaint(tmp); } if (bounds.y + bounds.height != oldBounds.y + oldBounds.height) { int minbottom = (int) Math.min(bounds.y + bounds.height, oldBounds.y + oldBounds.height); Rectangle tmp = new Rectangle(union.x, minbottom - 1, union.width, union.y + union.height - minbottom + 1); control.repaint(tmp); } if (!graphComponent.isToggleEvent(e) && !graphComponent.getGraph().isSelectionEmpty()) { graphComponent.getGraph().clearSelection(); } } e.consume(); } } /** * */ public void mouseReleased(MouseEvent e) { Rectangle rect = bounds; reset(); if (!e.isConsumed() && rect != null && graphComponent.isSignificant(rect.width, rect.height)) { select(rect, e); e.consume(); } } /* * (non-Javadoc) * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent) */ public void mouseClicked(MouseEvent arg0) { // empty } /* * (non-Javadoc) * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent) */ public void mouseEntered(MouseEvent arg0) { // empty } /* * (non-Javadoc) * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent) */ public void mouseExited(MouseEvent arg0) { // empty } /* * (non-Javadoc) * @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent) */ public void mouseMoved(MouseEvent arg0) { // empty }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?