2

我正忙于使用 JavaFX2 编写一个简单的应用程序。目标只是绘制 2 个节点(节点可以通过拖动来移动),然后具有在这些节点之间画线的功能。我完成了添加和移动节点的功能(目前我只是使用椭圆形状,但稍后我将用我自己的节点类替换它)但现在我正在努力处理连接线。添加节点或线条的操作来自下拉菜单,我在线条功能上有以下代码:

 private void drawLine(MenuItem line) {

    final BooleanProperty lineActive = new SimpleBooleanProperty(false);
    final BooleanProperty clickOne = new SimpleBooleanProperty(false);
    final BooleanProperty clickTwo = new SimpleBooleanProperty(false);

    line.setOnAction(new EventHandler<ActionEvent>() {
        public void handle(ActionEvent t) {              
            lineActive.set(true);
        }
    });

    nodeGroup.setOnMousePressed(new EventHandler<MouseEvent>() {
        public void handle(final MouseEvent t1) {
            clickOne.set(true);

            if (lineActive.get()) {

                if (clickOne.get()) {
                    //get x and y of first node
                    x1 = ((Ellipse) t1.getTarget()).getCenterX();
                    y1 = ((Ellipse) t1.getTarget()).getCenterY();
                    clickOne.set(false);
                    clickTwo.set(true);
                }

                if (clickTwo.get()) {
                    nodeGroup.setOnMouseClicked(new EventHandler<MouseEvent>() {
                        public void handle(MouseEvent t2) {
                            //get x and y of second node
                            x2 = ((Ellipse) t2.getTarget()).getCenterX();
                            y2 = ((Ellipse) t2.getTarget()).getCenterY();

                            //draw line between nodes
                            final Line line = new Line();
                            line.setStartX(x1);
                            line.setStartY(y1);
                            line.setEndX(x2);
                            line.setEndY(y2);

                            canvas.getChildren().add(line);

                            clickTwo.set(false);
                            lineActive.set(false);                     
                        }
                    });
                }
            }
        }
    });
}

我只有布尔值来检查第一次和第二次单击以获取每个节点的中心。我的第一个问题是,当我单击线功能并在 2 个节点之间添加一条线时,它似乎并没有结束该功能,并且我单击的任何其他节点都会得到一条线。我怎样才能防止它多次执行。

我的第二个问题是如何将线“连接”到节点,如果节点移动,线会停留在节点的中心?

谢谢。

4

2 回答 2

2

我认为有几件事可以使这更简单......

  1. 当您有两个以上的状态(不单击、单击一个、单击两个)时,不要使用布尔值,而是使用枚举。那么你只需要一个变量来照顾。
  2. 只在 nodeGroup 上设置一个鼠标侦听器并检查您所处的状态并在那里有适当的代码,而不是单独的鼠标侦听器。

我想该程序正在为第二次单击设置侦听器,而不是在完成后将其重置为第一次单击的侦听器。

于 2012-12-06T22:07:02.603 回答
0

由于我是 Stack Overflow 的新手,所以我尝试了一些关于您的问题的方法 首先在两个标签之间添加行

final Line line = new Line();

@Override
public void initialize(URL arg0, ResourceBundle arg1) 
{
    // TODO Auto-generated method stub

     line.setStartX(lblDragTest.getLayoutX());
     line.setStartY(lblDragTest.getLayoutY());
     line.setEndX(lblNew.getLayoutX());
     line.setEndY(lblNew.getLayoutY());
     rootAnchorPane.getChildren().add(line);

}

然后添加这个方法......

// This code handles label move
//set lblDragMousePressed method to Mouse Pressed event for lblDrag
@FXML
public void lblDragMousePressed(MouseEvent m)
{
    System.out.println("Mouse is pressed");     
    prevLblCordX= (int) lblDragTest.getLayoutX();
    prevLblCordY= (int) lblDragTest.getLayoutY();
    prevMouseCordX= (int) m.getX();
    prevMouseCordY= (int) m.getY();     
}
//set this method on mouse released event for lblDrag
@FXML
public void lblDragMouseReleased(MouseEvent m)
{       
    System.out.println("Label Dragged");    
}
// set this method on Mouse Drag event for lblDrag
@FXML
public void lblDragMouseDragged(MouseEvent m)
{   

    diffX= (int) (m.getX()- prevMouseCordX);
    diffY= (int) (m.getY()-prevMouseCordY );        
    int x = (int) (diffX+lblDragTest.getLayoutX()-rootAnchorPane.getLayoutX());
    int y = (int) (diffY+lblDragTest.getLayoutY()-rootAnchorPane.getLayoutY());     
    if (y > 0 && x > 0 && y < rootAnchorPane.getHeight() && x < rootAnchorPane.getWidth()) 
    { 
     lblDragTest.setLayoutX(x);
     lblDragTest.setLayoutY(y);
    }

    line.setStartX(lblDragTest.getLayoutX());
    line.setStartY(lblDragTest.getLayoutY());
    line.setEndX(lblNew.getLayoutX());
    line.setEndY(lblNew.getLayoutY());
    // rootAnchorPane.getChildren().add(line);      
}
于 2014-09-18T10:04:13.420 回答