我创建了一个画布,我的目标是在您点击画布的地方创建圆圈。但我也希望能够删除我绘制的圈子或至少最后绘制的圈子。在圆圈背景颜色相同的地方重画不是一个好的解决方案。因为如果圈子下还有其他东西,他们也会被删除。例如,在这个应用程序中,2个圆可能有交点,当您尝试删除第2个圆时,这些交点将是空的,这意味着也会删除第一个圆的某个部分。所以我想创建第二个画布。每次我在绘制圆圈前点击画布上的某处,我都会将主画布分配给备份画布。当我想删除最后绘制的对象时,我可以加载备份画布。
现在我试图做我上面解释过的,不能按照我打算做的那样工作。事实上,我甚至在其他事情上看到了一些奇怪的现象(至少对我来说)。
我所做的是基本上创建2个相同大小的画布。
public class Main extends Application {
double ldx, ldy, diameter;
Canvas lastCanvas = new Canvas(800,600);
Canvas pane1 = new Canvas(800,600);
@Override
public void start(Stage primaryStage) throws Exception{
System.out.println("Hello");
HBox root = new HBox();
GraphicsContext gc = pane1.getGraphicsContext2D();
pane1.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
// Draw circle around x,y
lastCanvas = pane1;
diameter = 25.0;
ldx = event.getSceneX() - (diameter/2);
ldy = event.getSceneY() - (diameter/2);
gc.strokeOval(ldx, ldy, diameter, diameter);
System.out.println("Clicked");
}
});
VBox pane2 = new VBox(10);
pane2.setPrefSize(224,600);
Button button1 = new Button("Clear Last Drawn");
button1.setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
pane1 = lastCanvas;
System.out.println("Last canvas loaded");
}
});
pane2.getChildren().addAll(button1);
pane1.setStyle("-fx-background-color: #224488");
pane2.setStyle("-fx-background-color: #224488");
root.getChildren().addAll(pane1, pane2);
Scene scene1 = new Scene(root, 1024, 600);
primaryStage.setScene(scene1);
primaryStage.setTitle("Mouse Clicker");
primaryStage.show();
}
}
预期的行为是,我每次点击按钮,它会加载lastCanvas这是画布,然后绘制最后一个对象。但事实并非如此。我在button1的mouseevent里面试过类似的东西
root.getChildren().removeAll();
root.getChildren().addAll(lastCanvas, pane2);
这会在每次点击按钮时在控制台上产生错误。另一个问题是我试图创建第二个场景。
HBox root2 = new HBox();
root2.getChildren().addAll(lastCanvas, pane2);
虽然我没有在任何地方使用root2,但是这样做令人惊讶地删除了pane2上的所有内容。我在这里所做的就是创建一个新的HBox并将pane2添加到该Hbox中。为什么这样做会从我的primaryStage中删除pane2而不是留下空白区域?
此外,如果您有其他建议删除画布上绘制的最后一个对象-once或直到canvas完全为空,您也可以告诉我,而不是试图解决我在上面的代码中做错了什么。
“这样做令人惊讶地删除了pane2上的所有内容,尽管我没有在任何地方使用root2,我在这里所做的只是创建一个新的HBox并将pane2添加到该hbox中。”=>从[Node doc](https:/ /docs.oracle.com/javase/8/javafx/api/javafx/scene/Node。如果一个程序向一个Parent(包括Group,Region等)添加一个子节点并且该节点已经是一个不同的Parent或一个Scene的根的子节点,那么该节点会自动(并且默默)从其前父母“。每个问题的一个问题是好的:-) – jewelsea