【发布时间】:2017-04-04 15:02:41
【问题描述】:
简介:
我创建了一个画布,我的目标是在您单击画布的位置创建圆圈。但我也希望能够删除我绘制的圆圈,或者至少是最后一个绘制的圆圈。用背景颜色在圆圈所在的同一位置重绘不是一个好的解决方案。因为如果圈子下还有其他东西,它们也会被删除。例如,在这个应用程序中,两个圆圈可能有交集,当您尝试删除第二个圆圈时,这些交点将为空,这意味着也删除了第一个圆圈的某些部分。所以我想到了创建第二个画布。每次我在画圆圈之前单击画布上的某个位置时,我都会将主画布分配给备用画布。当我想删除最后一个绘制的对象时,我可以加载备份画布。
现在我尝试按照上面的说明进行操作,但无法按我的预期工作。事实上,我什至在其他事情上看到了一些奇怪的(至少对我而言)行为。
我所做的基本上是创建 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,而不是留下空白?
此外,如果您有其他建议删除画布上绘制的最后一个对象(一次或直到画布完全为空),您也可以告诉我,而不是试图解决我在上面的代码中做错的事情。
【问题讨论】:
-
"尽管我没有在任何地方使用 root2,但这样做会令人惊讶地删除 pane2 上的所有内容。我在这里所做的只是创建一个新的 HBox 并将 pane2 也添加到该 hbox 中。" => 来自Node doc :“如果程序将子节点添加到父节点(包括组、区域等),并且该节点已经是不同父节点的子节点或场景的根节点,则该节点会自动(并且无声地)从其前一个节点中删除家长。”每个问题一个问题很好:-)
标签: java javafx javafx-8 java-canvas