// 鼠标按下时:开始画连线,记下连线的开始节点,并在开始节点中显示红色的中心圆 @Override public void doWhenMousePressed(ExecutionContext ec, MouseEvent evt) { if (ec.funcType == FuncType.PROCESS_TRANSITION) { // 画连线 BaseNode node = ec.getHelper().getFromAllNodeElementWhichContains(evt.getX(), evt.getY()); if (node != null) { node.setCenterCircleColor(Color.RED); // 显示红色的中心圆 node.setShowCenterCircle(true); fromNode = node; ec.needRepaint(); } } }
// 鼠标移动时:清除上次正在显示的节点的中心圆,并显示光标所在的节点的中心圆 @Override public void doWhenMouseMoved(ExecutionContext ec, MouseEvent evt) { if (ec.funcType == FuncType.PROCESS_TRANSITION) { // 画连线 // 1,先重画,以便擦除上次画的节点的中心圆 // TODO 如果没有移出正在显示的节点上,就不用这么样擦除再重画了 if (currentShowingCenterCircleNode != null) { currentShowingCenterCircleNode.setShowCenterCircle(false); currentShowingCenterCircleNode = null; ec.needRepaint(); } // 2,在移到某元素上时,在元素中点显示一个小圆点 BaseNode node = ec.getHelper().getFromAllNodeElementWhichContains(evt.getX(), evt.getY()); if (node != null) { node.setShowCenterCircle(true); // 让元素在中央显示一个小圆 currentShowingCenterCircleNode = node; ec.needRepaint(); } } }
// 鼠标拖拽时:更新正在画的连线 @Override public void doWhenMouseDragged(ExecutionContext ec, MouseEvent evt) { if (fromNode != null) { // 不停的更新连线,不需要判断是否是画连线状态,因为在MousePressed时已判断过了 // 1,先重画,以便擦除上次画的小圆点 if (toNode != null) { // From元素是要一直显示中心圆的 toNode.setShowCenterCircle(false); toNode = null; } // 2,找出当前坐标所在的节点,并在光标所在的节点中显示中心圆 toNode = ec.getHelper().getFromAllNodeElementWhichContains(evt.getX(), evt.getY()); if (toNode == fromNode) { toNode = null; // 如果to和from是一个节点,就不需要重复显示中心圆 } if (toNode != null) { toNode.setShowCenterCircle(true); // 显示中心圆 } // 3,显示从From节点到当前位置的连线 ec.getHelper().repaintDesignerPanel(); // 需要先重画 Transition.drawTranstionFromConterPointTo(ec.getGraphics(), fromNode, evt.getX(), evt.getY()); } }
// 鼠标释放时:添加或取消一个Transition @Override public void doWhenMouseReleased(ExecutionContext ec, MouseEvent evt) { if (ec.funcType == FuncType.PROCESS_TRANSITION) { // 画连线 // 1,如果有From与To元素,且不是同一个元素,就创建并添加一个新的连线元素 if (fromNode != null && toNode != null && fromNode != toNode) { Transition transition = new Transition(fromNode, toNode); ec.addNewElement(transition); // 添加 } // 2,不再显示小中心圆 if (fromNode != null) { fromNode.setShowCenterCircle(false); fromNode.setCenterCircleColor(Color.BLUE); // TODO 还原中心点的默认颜色 fromNode = null; } if (toNode != null) { toNode.setShowCenterCircle(false); toNode = null; } // 3,需要重新显示 ec.needRepaint(); } }