2017-07-19 17 views
0

javafxにポリゴンを描画して、マウスの座標をそのポイントの配列に追加しようとしています。私の問題は、マウスの左クリックから何か他のものをクリックすると、それを止める方法を知らないということです。javafxでポリゴンを描く

Polygon polygon = new Polygon(); 
rootPane.setOnMouseClicked((MouseEvent mouseEvent) -> { 
    do { 
     polygon.getPoints().addAll(mouseEvent.getX(),mouseEvent.getY()); 
    } while(mouseEvent.getButton().equals(mouseEvent.isSecondaryButtonDown()));  
}); 
rootPane.getChildren().add(polygon); 
+0

明確にするために、イベントハンドラに渡すコード(onMouseClickedなど)は、イベントが発生するたびに*実行されます。ここにループは必要ありません。 –

答えて

2

ポリゴンへの参照を作成することができます。最初のクリックの場合は、ポリゴンはnullになるので、新しいポリゴンを作成してペインに追加します。次に右クリックを得るまでポイントを追加し続けます。そのポイントでポリゴンをnullに戻して、次の左クリックが新しいポリゴンを再び開始するようにします。

SSCCE:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.input.MouseButton; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Polygon; 
import javafx.stage.Stage; 

public class DrawPolygon extends Application { 

    private Polygon currentPolygon ; 

    @Override 
    public void start(Stage primaryStage) { 
     Pane rootPane = new Pane(); 
     rootPane.setMinSize(600, 600); 
     rootPane.setOnMouseClicked(e -> { 
      if (e.getButton() == MouseButton.PRIMARY) { 
       if (currentPolygon == null) { 
        currentPolygon = new Polygon(); 
        currentPolygon.setStroke(Color.BLACK); 
        rootPane.getChildren().add(currentPolygon); 
       } 
       currentPolygon.getPoints().addAll(e.getX(), e.getY()); 
      } else { 
       currentPolygon = null ; 
      } 
     }); 
     Scene scene = new Scene(rootPane); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

あなたは、例えば、異なるユーザーエクスペリエンスを得るために、この周りの様々なアイデアで遊ぶことができます

rootPane.setOnMouseClicked(e -> { 
     if (e.getButton() == MouseButton.PRIMARY) { 
      if (currentPolygon == null) { 
       currentPolygon = new Polygon(); 
       currentPolygon.getPoints().addAll(e.getX(), e.getY()); 
       currentPolygon.setStroke(Color.BLACK); 
       rootPane.getChildren().add(currentPolygon); 
      } 
      currentPolygon.getPoints().addAll(e.getX(), e.getY()); 
     } else { 
      currentPolygon = null ; 
     } 
    }); 
    rootPane.setOnMouseMoved(e -> { 
     if (currentPolygon != null) { 
      currentPolygon.getPoints().set(currentPolygon.getPoints().size()-2, e.getX()); 
      currentPolygon.getPoints().set(currentPolygon.getPoints().size()-1, e.getY()); 
     } 
    }); 
1

問題は、コードが1つのイベントでスタックしてしまうことです。マウスを動かしたり、マウスボタンを離しても、使用しているイベントインスタンスの値は変更されません。

イベントを単一の状態と見なします。何か重要なことが起こると(あなたのマウスボタンがクリックされると)、javafxは、そのverryの瞬間にマウスの状態でMouseEventインスタンスを使ってmouseEventHandlerを呼び出します。再度クリックすると、javafxは新しい値で新しいインスタンスを作成し、再度eventHandlerを呼び出します。

この作業を行うには、別のマウスイベントが必要です(またはマウスのクリック1回だけの点を設定するようにわずかに変更する必要があります)。あなたは(無限の)whileループを失う必要があります。なぜなら、EventThreadをブロックし、必要なものを処理していないからです。だから、このようなものが少しうまくいくかもしれません。

// this will add a point for every (secondary)mousebutton click 
rootPane.setOnMouseClicked((MouseEvent me) -> { 
    if(me.isSecondaryButtonDown()) 
     polygon.getPoints().addAll(me.getX(),me.getY()); 
    }); 

// this will add a point for every mousemovement while the secondary mousebutton is down. 
rootPane.setOnMouseMoved((MouseEvent) me -> { 
    if(me.isSecondaryButtonDown()) 
     polygon.getPoints().addAll(me.getX(),me.getY()); 
}); 

は、今そこにMouseDragEventあるが、ほとんど(画像やファイルなど)のデータを移動するためのthatsのが、私はそれをお勧めwouldntの。あなたの場合、それはそれほど有用ではありません、そして、その行動はまだバグを終了します。

これが正しい方向にあなたを助けてくれることを願っています。

関連する問題