📄 tgpanel.java~
字号:
public synchronized void removePaintListener(TGPaintListener pl){
paintListeners.removeElement(pl);
}
private void redraw() {
resetDamper();
}
public void setMaintainMouseOver( boolean maintain ) {
maintainMouseOver = maintain;
}
public void clearSelect() {
if ( select != null ) {
select = null;
repaint();
}
}
/** A convenience method that selects the first node of a graph, so that hiding works.
*/
public void selectFirstNode() {
setSelect(getGES().getFirstNode());
}
public void setSelect( Node node ) {
if ( node != null ) {
select = node;
repaint();
} else if ( node == null ) clearSelect();
}
public void multiSelect( TGPoint2D from, TGPoint2D to ) {
final double minX,minY,maxX,maxY;
if ( from.x > to.x ) { maxX = from.x; minX = to.x; }
else { minX = from.x; maxX = to.x; }
if ( from.y > to.y ) { maxY = from.y; minY = to.y; }
else { minY = from.y; maxY = to.y; }
final Vector selectedNodes = new Vector();
TGForEachNode fen = new TGForEachNode() {
public void forEachNode( Node node ) {
double x = node.drawx;
double y = node.drawy;
if ( x > minX && x < maxX && y > minY && y < maxY ) {
selectedNodes.addElement(node);
}
}
};
visibleLocality.forAllNodes(fen);
if ( selectedNodes.size() > 0 ) {
int r = (int)( Math.random()*selectedNodes.size() );
setSelect((Node)selectedNodes.elementAt(r));
} else {
clearSelect();
}
}
public void updateLocalityFromVisibility() throws TGException {
visibleLocality.updateLocalityFromVisibility();
}
public void setLocale( Node node, int radius, int maxAddEdgeCount, int maxExpandEdgeCount,
boolean unidirectional ) throws TGException {
localityUtils.setLocale(node,radius, maxAddEdgeCount, maxExpandEdgeCount, unidirectional);
}
public void fastFinishAnimation() { //Quickly wraps up the add node animation
localityUtils.fastFinishAnimation();
}
public void setLocale( Node node, int radius ) throws TGException {
localityUtils.setLocale(node,radius);
}
public void expandNode( Node node ) {
localityUtils.expandNode(node);
}
public void hideNode( Node hideNode ) {
localityUtils.hideNode(hideNode );
}
public void collapseNode( Node collapseNode ) {
localityUtils.collapseNode(collapseNode );
}
public void hideEdge( Edge hideEdge ) {
visibleLocality.removeEdge(hideEdge);
if ( mouseOverE == hideEdge ) setMouseOverE(null);
resetDamper();
}
public void setDragNode( Node node ) {
dragNode = node;
tgLayout.setDragNode(node);
}
public Node getDragNode() {
return dragNode;
}
void setMousePos( Point p ) {
mousePos = p;
}
public Point getMousePos() {
return mousePos;
}
/** Start and stop the damper. Should be placed in the TGPanel too. */
public void startDamper() {
if (tgLayout!=null) tgLayout.startDamper();
}
public void stopDamper() {
if (tgLayout!=null) tgLayout.stopDamper();
}
/** Makes the graph mobile, and slowly slows it down. */
public void resetDamper() {
if (tgLayout!=null) tgLayout.resetDamper();
}
/** Gently stops the graph from moving */
public void stopMotion() {
if (tgLayout!=null) tgLayout.stopMotion();
}
class BasicMouseListener extends MouseAdapter {
public void mouseEntered(MouseEvent e) {
addMouseMotionListener(basicMML);
}
public void mouseExited(MouseEvent e) {
removeMouseMotionListener(basicMML);
mousePos = null;
setMouseOverN(null);
setMouseOverE(null);
repaint();
}
}
class BasicMouseMotionListener implements MouseMotionListener {
public void mouseDragged(MouseEvent e) {
mousePos = e.getPoint();
findMouseOver();
try {
Thread.currentThread().sleep(6); //An attempt to make the cursor flicker less
} catch (InterruptedException ex) {
//break;
}
}
public void mouseMoved( MouseEvent e ) {
mousePos = e.getPoint();
synchronized (this) {
Edge oldMouseOverE = mouseOverE;
Node oldMouseOverN = mouseOverN;
findMouseOver();
if (oldMouseOverE!=mouseOverE || oldMouseOverN!=mouseOverN) {
repaint();
}
// Replace the above lines with the commented portion below to prevent whole graph
// from being repainted simply to highlight a node On mouseOver.
// This causes some annoying flickering though.
/*
if(oldMouseOverE!=mouseOverE) {
if (oldMouseOverE!=null) {
synchronized(oldMouseOverE) {
oldMouseOverE.paint(TGPanel.this.getGraphics(),TGPanel.this);
oldMouseOverE.from.paint(TGPanel.this.getGraphics(),TGPanel.this);
oldMouseOverE.to.paint(TGPanel.this.getGraphics(),TGPanel.this);
}
}
if (mouseOverE!=null) {
synchronized(mouseOverE) {
mouseOverE.paint(TGPanel.this.getGraphics(),TGPanel.this);
mouseOverE.from.paint(TGPanel.this.getGraphics(),TGPanel.this);
mouseOverE.to.paint(TGPanel.this.getGraphics(),TGPanel.this);
}
}
}
if(oldMouseOverN!=mouseOverN) {
if (oldMouseOverN!=null) oldMouseOverN.paint(TGPanel.this.getGraphics(),TGPanel.this);
if (mouseOverN!=null) mouseOverN.paint(TGPanel.this.getGraphics(),TGPanel.this);
}
*/
}
}
}
protected synchronized void findMouseOver() {
if ( mousePos == null ) {
setMouseOverN(null);
setMouseOverE(null);
return;
}
final int mpx=mousePos.x;
final int mpy=mousePos.y;
final Node[] monA = new Node[1];
final Edge[] moeA = new Edge[1];
TGForEachNode fen = new TGForEachNode() {
double minoverdist = 100; //Kind of a hack (see second if statement)
//Nodes can be as wide as 200 (=2*100)
public void forEachNode( Node node ) {
double x = node.drawx;
double y = node.drawy;
double dist = Math.sqrt((mpx-x)*(mpx-x)+(mpy-y)*(mpy-y));
if ( ( dist < minoverdist ) && node.containsPoint(mpx,mpy) ) {
minoverdist = dist;
monA[0] = node;
}
}
};
visibleLocality.forAllNodes(fen);
TGForEachEdge fee = new TGForEachEdge() {
double minDist = 8; // Tangential distance to the edge
double minFromDist = 1000; // Distance to the edge's "from" node
public void forEachEdge( Edge edge ) {
double x = edge.from.drawx;
double y = edge.from.drawy;
double dist = edge.distFromPoint(mpx,mpy);
if ( dist < minDist ) { // Set the over edge to the edge with the minimun tangential distance
minDist = dist;
minFromDist = Math.sqrt((mpx-x)*(mpx-x)+(mpy-y)*(mpy-y));
moeA[0] = edge;
} else if ( dist == minDist ) { // If tangential distances are identical, chose
// the edge whose "from" node is closest.
double fromDist = Math.sqrt((mpx-x)*(mpx-x)+(mpy-y)*(mpy-y));
if ( fromDist < minFromDist ) {
minFromDist = fromDist;
moeA[0] = edge;
}
}
}
};
visibleLocality.forAllEdges(fee);
setMouseOverN(monA[0]);
if ( monA[0] == null )
setMouseOverE(moeA[0]);
else
setMouseOverE(null);
}
TGPoint2D topLeftDraw = null;
TGPoint2D bottomRightDraw = null;
public TGPoint2D getTopLeftDraw() {
return new TGPoint2D(topLeftDraw);
}
public TGPoint2D getBottomRightDraw() {
return new TGPoint2D(bottomRightDraw);
}
public TGPoint2D getCenter() {
return tgLensSet.convDrawToReal(getSize().width/2,getSize().height/2);
}
public TGPoint2D getDrawCenter() {
return new TGPoint2D(getSize().width/2,getSize().height/2);
}
public void updateGraphSize() {
if ( topLeftDraw == null ) topLeftDraw=new TGPoint2D(0,0);
if ( bottomRightDraw == null ) bottomRightDraw=new TGPoint2D(0,0);
TGForEachNode fen = new TGForEachNode() {
boolean firstNode=true;
public void forEachNode( Node node ) {
if ( firstNode ) { //initialize topRight + bottomLeft
topLeftDraw.setLocation(node.drawx,node.drawy);
bottomRightDraw.setLocation(node.drawx,node.drawy);
firstNode=false;
} else { //Standard max and min finding
topLeftDraw.setLocation(Math.min(node.drawx,topLeftDraw.x),
Math.min(node.drawy,topLeftDraw.y));
bottomRightDraw.setLocation(Math.max(node.drawx, bottomRightDraw.x),
Math.max(node.drawy, bottomRightDraw.y));
}
}
};
visibleLocality.forAllNodes(fen);
}
public synchronized void processGraphMove() {
updateDrawPositions();
updateGraphSize();
}
public synchronized void repaintAfterMove() { // Called by TGLayout + others to indicate that graph has moved
processGraphMove();
findMouseOver();
fireMovedEvent();
repaint();
}
public void updateDrawPos( Node node ) { //sets the visual position from the real position
TGPoint2D p = tgLensSet.convRealToDraw(node.x,node.y);
node.drawx = p.x;
node.drawy = p.y;
}
public void updatePosFromDraw( Node node ) { //sets the real position from the visual position
TGPoint2D p = tgLensSet.convDrawToReal(node.drawx,node.drawy);
node.x = p.x;
node.y = p.y;
}
public void updateDrawPositions() {
TGForEachNode fen = new TGForEachNode() {
public void forEachNode( Node node ) {
updateDrawPos(node);
}
};
visibleLocality.forAllNodes(fen);
}
Color myBrighter( Color c ) {
int r = c.getRed();
int g = c.getGreen();
int b = c.getBlue();
r=Math.min(r+96, 255);
g=Math.min(g+96, 255);
b=Math.min(b+96, 255);
return new Color(r,g,b);
}
public synchronized void paint( Graphics g ) {
update(g);
}
public synchronized void update( Graphics g ) {
Dimension d = getSize();
if ( (offscreen == null)
|| ( d.width != offscreensize.width )
|| ( d.height != offscreensize.height )) {
offscreen = createImage(d.width, d.height);
offscreensize = d;
offgraphics = offscreen.getGraphics();
processGraphMove();
findMouseOver();
fireMovedEvent();
}
offgraphics.setColor(BACK_COLOR);
offgraphics.fillRect(0, 0, d.width, d.height);
synchronized(this) {
paintListeners = (Vector)paintListeners.clone();
}
for ( int i = 0; i < paintListeners.size(); i++ ) {
TGPaintListener pl = (TGPaintListener) paintListeners.elementAt(i);
pl.paintFirst(offgraphics);
}
TGForEachEdge fee = new TGForEachEdge() {
public void forEachEdge( Edge edge ) {
edge.paint(offgraphics, TGPanel.this);
}
};
visibleLocality.forAllEdges(fee);
for ( int i = 0; i < paintListeners.size() ; i++ ) {
TGPaintListener pl = (TGPaintListener) paintListeners.elementAt(i);
pl.paintAfterEdges(offgraphics);
}
TGForEachNode fen = new TGForEachNode() {
public void forEachNode( Node node ) {
node.paint(offgraphics,TGPanel.this);
}
};
visibleLocality.forAllNodes(fen);
if ( mouseOverE != null ) { //Make the edge the mouse is over appear on top.
mouseOverE.paint(offgraphics, this);
mouseOverE.from.paint(offgraphics, this);
mouseOverE.to.paint(offgraphics, this);
}
if ( select != null ) { //Make the selected node appear on top.
select.paint(offgraphics, this);
}
if ( mouseOverN != null ) { //Make the node the mouse is over appear on top.
mouseOverN.paint(offgraphics, this);
}
for ( int i = 0; i < paintListeners.size(); i++ ) {
TGPaintListener pl = (TGPaintListener)paintListeners.elementAt(i);
pl.paintLast(offgraphics);
}
paintComponents(offgraphics); //Paint any components that have been added to this panel
g.drawImage(offscreen, 0, 0, null);
}
public static void main( String[] args ) {
JFrame frame;
frame = new JFrame("TGPanel");
TGPanel tgPanel = new TGPanel();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}
});
TGLensSet tgls = new TGLensSet();
tgls.addLens(tgPanel.getAdjustOriginLens());
tgPanel.setLensSet(tgls);
try {
tgPanel.addNode(); //Add a starting node.
} catch ( TGException tge ) {
System.err.println(tge.getMessage());
}
tgPanel.setVisible(true);
new GLEditUI(tgPanel).activate();
frame.getContentPane().add("Center", tgPanel);
frame.setSize(500,500);
frame.setVisible(true);
}
} // end com.touchgraph.graphlayout.TGPanel
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -