2016-07-19 10 views
0

練習では、矩形をクリックすると、矩形の境界に円が表示されます。しかし、右mouseButtonが円で押されたときは、それを削除する必要があります。私は追加されている円を格納するためにArrayListを使用しています。しかし、どのサークルがクリックされたかをどのように知ることができますか?その円を削除するには、その円に対してClickイベントを呼び出す必要があります。あなたが読んでくださいだけの時間がそれにアクセスするので、リスト中の円の保存複数のノードでのマウスイベント

package sample; 

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.scene.Scene; 
import javafx.scene.input.MouseButton; 
import javafx.scene.text.FontPosture; 
import javafx.scene.text.FontWeight; 
import javafx.stage.Stage; 
import javafx.scene.shape.Rectangle; 
import javafx.scene.shape.Circle; 
import javafx.scene.paint.Color; 
import javafx.scene.control.Label; 
import java.util.ArrayList; 
import javafx.scene.text.Font; 
import javafx.scene.layout.Pane; 

public class Main extends Application { 

    private ArrayList <Circle> circles = new ArrayList<>(); 
    private Rectangle rectangle = new Rectangle(200, 100, 1000, 600); 

    private Label[] label = new Label[2]; 
    private int counter = 0; 

    private Pane pane = new Pane(); 

    @Override 
    public void start(Stage stage) throws Exception { 
     rectangle.setFill(Color.WHITE); 
     rectangle.setStroke(Color.BLACK); 
     rectangle.setStrokeWidth(1); 

     rectangle.setOnMouseClicked(e -> { 
      if(e.getButton() == MouseButton.PRIMARY) { 
       // e.getX and e.getY will place the circle at the location of cursor click 
       AddCircle(e.getX(), e.getY()); 
      } 
     }); 

     // will format the labels to be added on the pane 
     formatLabels(); 

     pane.getChildren().addAll(label[0], label[1], rectangle); 
     Scene scene = new Scene(pane, 1200, 650, Color.ANTIQUEWHITE); 
     stage.setScene(scene); 
     stage.setTitle("Add and Remove Circles"); 
     stage.show(); 
    } 

    public void AddCircle(double X, double Y) { 
     Circle circle = new Circle(X, Y, 10); 
     circle.setFill(Color.WHITE); 
     circle.setStroke(Color.BLACK); 
     circle.setStrokeWidth(1); 

     // adds circle object at value of counter 
     circles.add(counter, circle); 
     // setting id for object 
     circles.get(counter).setId("" + counter); 
     // adding circle from list into the pane 
     pane.getChildren().add(circles.get(counter)); 

     // incrementing the counter after circle object is added 
     ++counter; 
    } 

    private void formatLabels() { 
     label[0] = new Label(); 
     label[0].setTranslateX(20); 
     label[0].setTranslateY(20); 
     label[0].setText("Press Left Mouse key to add a circle"); 
     label[0].setFont(Font.font("Calibri", FontWeight.BLACK, FontPosture.REGULAR, 15)); 

     label[1] = new Label(); 
     label[1].setTranslateX(20); 
     label[1].setTranslateY(40); 
     label[1].setText("Press Right key on a circle to remove it"); 
     label[1].setFont(Font.font("Calibri", FontWeight.BLACK, FontPosture.REGULAR, 15)); 
    } 

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

ストレートフォワード方式:新しいものから古いものまで繰り返し、クリック点を含むものがあれば削除します。 – Thomas

+0

重複:http://stackoverflow.com/questions/31430767/add-remove-by-mouse-click –

+0

1つの質問:なぜあなたは 'counter'を保ち、そのインデックスに追加するのですか?あなたのコードから、 'circles.size()'が同じことをするように見えます(サークルをリストに追加する前にidを設定するとidは 'circles.size()+ 1'になります)。 – Thomas

答えて

0

は、私には不要と思われるあなたがサークルへの参照を取得するとき、あなただけのリストに追加され、circleはすでに(その参照が含まれていますAddCircle方法)。

円をリムーバブルにするには、onMouseClickedハンドラを追加するだけです。 Circleイベントターゲットとして利用可能である:一次及び二次マウスボタンが、例えば、左と右のマウスボタンではないかもしれないこと

private final EventHandler<MouseEvent> removeHandler = evt -> { 
    if (evt.getButton() == MouseButton.SECONDARY) { 
     // remove clicked node (the circle) as child of pane 
     this.pane.getChildren().remove(evt.getTarget()); 
    } 
}; 

public void AddCircle(double X, double Y) { 
    Circle circle = new Circle(X, Y, 10); 
    circle.setFill(Color.WHITE); 
    circle.setStroke(Color.BLACK); 
    circle.setStrokeWidth(1); 

    // setting id for object 
    circle.setId("" + counter); 

    // allow circle removal via mouse click 
    circle.setOnMouseClicked(removeHandler); 

    // adding circle into the pane 
    pane.getChildren().add(circle); 

    // incrementing the counter after circle object is added 
    ++counter; 
} 

注マウスの設定がマウスを左利きのマウスに変更する場合

関連する問題