2016-03-22 3 views
2

マウスイベントでポイントまたは円を追加および削除するためのコードを次のように記述しました。次のステップは、それらを作成しながら(ポリゴンを作成する)それらを線で結合することです。私は完全に立ち往生し、どこから始めるべきか分からない。私はドキュメンテーションを探していますが、誰かが私を正しい方向に向けることができたら感謝します。javaFXでのポイントの結合

私は、あなたのウィンドウの子に変更リスナーを追加ペインにポリゴンを追加し、より多くの後、2円が存在する場合、あなたはポリゴンを再描画う
package application; 

//import all needed classes 
import javafx.collections.ObservableList; 
import javafx.scene.input.MouseButton; 
import javafx.application.Application; 
import javafx.scene.shape.Circle; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 
import javafx.scene.Node; 

public class Main extends Application { 

    // using the base class of layout panes 
    Pane pane = new Pane(); 

    @Override 
    public void start(Stage primaryStage) { 

     // what to do when the mouse is clicked 
     pane.setOnMouseClicked(e -> { 
      double drawX = e.getX();// position of mouse in X axle 
      double drawY = e.getY();// position of mouse in y axle 

      if (e.getButton() == MouseButton.PRIMARY) {// get the position of the mouse point when user left click 
       Circle circle = makeCircle(drawX, drawY);// using the makeCircle method to draw the circle where the mouse is at the click 
       pane.getChildren().add(circle); 
      } else if (e.getButton() == MouseButton.SECONDARY) { 
       deleteCircle(drawX, drawY);// using the deleteCircle function to delete the circle if right click on the circle 
      } 

     }); 

     // container to show all context in a 500px by 500px windows 
     try { 
      Scene scene = new Scene(pane, 500, 500);// size of the scene 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    // method to draw the circle when left click 
    private Circle makeCircle(double drawX, double drawY) { 
     Circle circle = new Circle(drawX, drawY, 7, Color.CORAL);// create the circle and its properties(color: coral to see it better) 
     circle.setStroke(Color.BLACK);// create the stroke so the circle is more visible 
     return circle; 
    } 

    // method to delete the circle using the ObservableList class 
    private void deleteCircle(double deletX, double deleteY) { 

     // loop to create my list of circles 'til this moment 
     ObservableList<Node> list = pane.getChildren(); 
     for (int i = list.size() - 1; i >= 0; i--) { 
      Node circle = list.get(i); 

      // checking which circle I want to delete 
      if (circle instanceof Circle && circle.contains(deletX, deleteY)) { 
       pane.getChildren().remove(circle); 
       break; 
      } 
     } 
    } 

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

答えて

2

public class Main extends Application { 

    // using the base class of layout panes 
    Pane pane = new Pane(); 
    Polygon polygon = new Polygon(); 

    @Override 
    public void start(Stage primaryStage) { 

     // what to do when the mouse is clicked 
     pane.setOnMouseClicked(e -> { 
      double drawX = e.getX();// position of mouse in X axle 
      double drawY = e.getY();// position of mouse in y axle 

      if (e.getButton() == MouseButton.PRIMARY) {// get the position of the mouse point when user left click 
       Circle circle = makeCircle(drawX, drawY);// using the makeCircle method to draw the circle where the mouse is at the click 
       pane.getChildren().add(circle); 
      } else if (e.getButton() == MouseButton.SECONDARY) { 
       deleteCircle(drawX, drawY);// using the deleteCircle function to delete the circle if right click on the circle 
      } 

     }); 

     pane.getChildren().add(polygon); 

     pane.getChildren().addListener(new ListChangeListener<Node>() { 
      @Override 
      public void onChanged(Change<? extends Node> c) { 
       int numOfCircles = pane.getChildren().size() - 1; 
       if (numOfCircles >= 2) { 
        polygon.setStroke(Color.BLACK); 
        polygon.getPoints().clear(); 
        for (int i = 0; i <= numOfCircles; i++) { 
         Node node = pane.getChildren().get(i); 
         if (node.getClass() == Circle.class) { 
          polygon.getPoints().addAll(
            ((Circle) node).getCenterX(), 
            ((Circle) node).getCenterY() 
          ); 
         } 
        } 
        System.out.println(polygon.getPoints()); 
       } 
      } 
     }); 

     // container to show all context in a 500px by 500px windows 
     try { 
      Scene scene = new Scene(pane, 500, 500);// size of the scene 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    // method to draw the circle when left click 
    private Circle makeCircle(double drawX, double drawY) { 
     Circle circle = new Circle(drawX, drawY, 7, Color.CORAL);// create the circle and its properties(color: coral to see it better) 
     circle.setStroke(Color.BLACK);// create the stroke so the circle is more visible 
     return circle; 
    } 

    // method to delete the circle using the ObservableList class 
    private void deleteCircle(double deletX, double deleteY) { 

     // loop to create my list of circles 'til this moment 
     ObservableList<Node> list = pane.getChildren(); 
     for (int i = list.size() - 1; i >= 0; i--) { 
      Node circle = list.get(i); 

      // checking which circle I want to delete 
      if (circle instanceof Circle && circle.contains(deletX, deleteY)) { 
       pane.getChildren().remove(circle); 
       break; 
      } 
     } 
    } 

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

} 

することができますまた、変更リスナーを使用せず、サークルを追加または削除するたびに再描画を呼び出します。また、あなたはまた、削除関数を呼び出すと、より効率的な方法で削除する各サークルへのonclickリスナーを追加することができます。

public class Main extends Application { 

    // using the base class of layout panes 
    Pane pane = new Pane(); 
    Polygon polygon = new Polygon(); 

    @Override 
    public void start(Stage primaryStage) { 

     // what to do when the mouse is clicked 
     pane.setOnMouseClicked(e -> { 
      double drawX = e.getX();// position of mouse in X axle 
      double drawY = e.getY();// position of mouse in y axle 

      if (e.getButton() == MouseButton.PRIMARY) {// get the position of the mouse point when user left click 
       Circle circle = makeCircle(drawX, drawY);// using the makeCircle method to draw the circle where the mouse is at the click 
       pane.getChildren().add(circle); 
       circle.setOnMouseClicked(event -> { 
        deleteCircle(circle); 
        // consume event so that the pane on click does not get called 
        event.consume(); 
       }); 
       redrawPolygon(); 
      } 

     }); 

     polygon = new Polygon(); 
     polygon.setFill(Color.TRANSPARENT); 
     polygon.setStroke(Color.BLACK); 
     pane.getChildren().add(polygon); 

     // container to show all context in a 500px by 500px windows 
     try { 
      Scene scene = new Scene(pane, 500, 500);// size of the scene 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    // method to draw the circle when left click 
    private Circle makeCircle(double drawX, double drawY) { 
     Circle circle = new Circle(drawX, drawY, 7, Color.CORAL);// create the circle and its properties(color: coral to see it better) 
     circle.setStroke(Color.BLACK);// create the stroke so the circle is more visible 
     return circle; 
    } 

    private void redrawPolygon() { 
     int numOfCircles = pane.getChildren().size() - 1; 
     if (numOfCircles > 0) { 
      polygon.getPoints().clear(); 
      for (int i = 0; i <= numOfCircles; i++) { 
       Node node = pane.getChildren().get(i); 
       if (node.getClass() == Circle.class) { 
        polygon.getPoints().addAll(
          ((Circle) node).getCenterX(), 
          ((Circle) node).getCenterY() 
        ); 
       } 
      } 
     } 
    } 

    private void deleteCircle(Circle circle){ 
     pane.getChildren().remove(circle); 
     redrawPolygon(); 
    } 

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

} 

だけワンクリックハンドラを使用する場合は、それをこの方法でも行うことができます:

pane.setOnMouseClicked(e -> { 

     if (e.getTarget().getClass() == Circle.class) { 
      deleteCircle((Circle)e.getTarget()); 
     } else { 
      Circle circle = makeCircle(e.getX(), e.getY());// using the makeCircle method to draw the circle where the mouse is at the click 
      pane.getChildren().add(circle); 
      redrawPolygon(); 
     } 

    }); 
+0

ありがとうございました!私は本当にあなたの助けに感謝します。私は今日家に帰るときに試してみる。 – gnimm

+0

素晴らしいです。今私の次のステップは、私は線がお互いに交差することを望んでいないということです。私はアルゴリズムを使用する必要があることを知っています。誰かがアルゴリズムの名前は何か、および/または私のコードでそれをどのように実装するのかを知っていますか? – gnimm

+0

これにはスタックオーバーフローに関する他の解決策があります。 [ここに私自身である](https://gist.github.com/anonymous/8b4a0e85ccf897d9cec0)。私がやっていることは、中心を計算してから、その中心に比べてすべての点の角度を計算することです。その後、角度でソートし、並べ替えられたリストを使ってポリゴンを描画します。 [これは別の解決策です](http://stackoverflow.com/questions/14263284/create-non-intersecting-polygon-passing-through-all-givenpoints)。 – JohnRW