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);                     
                        }
                    });
                }
            }
        }
    });
}

各ノードの中心を取得するために、1回目と2回目のクリックをチェックするブール値があります。私の最初の質問は、ライン関数をクリックして2つのノードの間にラインを追加すると、関数が終了していないように見え、クリックした他のノードがラインを取得することです。どうすれば複数回実行されないようにすることができますか。

そして私の2番目の質問は、ノードが移動した場合にラインがノードの中央に留まるように、ラインをノードに「接続」するにはどうすればよいですか?

ありがとう。

4

2 に答える 2

2

これを簡単にすることができることがいくつかあると思います...

  1. 3つ以上の状態(クリックなし、1つクリック、2つクリック)がある場合はブール値を使用しないでください。代わりに列挙型を使用してください。そうすれば、世話をするのに必要な変数は1つだけです。
  2. nodeGroupにマウスリスナーを1つだけ設定し、現在の状態を確認して、個別のマウスリスナーではなく、適切なコードをそこに配置します。

プログラムが2回目のクリックでリスナーを設定し、完了時に1回目のクリックでリスナーにリセットされていないことを想像します。

于 2012-12-06T22:07:02.603 に答える
0

私はStackOverflowを初めて使用するので、問題について何かを試しました。最初に2つのラベルの間に行を追加します

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 に答える