**15.15 (几何问题:添加或删除点)
- 请编写一个程序,让用户在面板上单击以自动创建或移去点(参见15-28a)。当用户左击鼠标时(主按钮),就创建一个点并且显示在鼠标的位置,用户还可以将鼠标移到一个点上,然后右击鼠标(次按钮)以移去这个点
答题思路:
- 新建一个面板Pane(),和一个Circle类型的ArrayList
- 为面板注册一个事件(鼠标点击:setOnMouseClicked)
- 如果鼠标点的是左键:e.getButton() == MouseButton.PRIMARY,则新建一个圆,同时添加到布局和ArrayList中
- 如果点的是右键,创建一个迭代器
iterator
用于遍历存储所有圆圈的ArrayList<Circle>
列表,使用contains()
方法检查鼠标位置是否在圆圈内, 如果是,那么同时在List和Pane中删除圆圈
- 代码展示:编程练习题15_15AddOrDeletePoints.java
package chapter_15;
import java.util.ArrayList;
import java.util.Iterator;
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.Circle;
import javafx.stage.Stage;
public class 编程练习题15_15AddOrDeletePoints extends Application{
@Override
public void start(Stage primaryStage) throws Exception {
Pane pane = new Pane();
ArrayList<Circle> list = new ArrayList<>();
pane.setOnMouseClicked(e ->{
double x = e.getX();
double y = e.getY();
if(e.getButton() == MouseButton.PRIMARY) {
Circle circle = new Circle(x,y,10);
circle.setFill(Color.WHITE);
circle.setStroke(Color.BLACK);
pane.getChildren().add(circle);
list.add(circle);
}
else if (e.getButton() == MouseButton.SECONDARY) {
Iterator<Circle> iterator = list.iterator();
while (iterator.hasNext()) {
Circle c = iterator.next();
if (c.contains(x, y)) {
pane.getChildren().remove(c);
iterator.remove(); // 使用迭代器的remove方法
}
}
}
});
Scene scene = new Scene(pane, 300, 300);
primaryStage.setTitle("编程练习题15_15AddOrDeletePoints");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}
- 结果展示