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);
}
}
ストレートフォワード方式:新しいものから古いものまで繰り返し、クリック点を含むものがあれば削除します。 – Thomas
重複:http://stackoverflow.com/questions/31430767/add-remove-by-mouse-click –
1つの質問:なぜあなたは 'counter'を保ち、そのインデックスに追加するのですか?あなたのコードから、 'circles.size()'が同じことをするように見えます(サークルをリストに追加する前にidを設定するとidは 'circles.size()+ 1'になります)。 – Thomas