我創建了一個畫布,我的目標是在您點擊畫布的地方創建圓圈。但我也希望能夠刪除我繪製的圈子或至少最後繪製的圈子。在圓圈背景顏色相同的地方重畫不是一個好的解決方案。因爲如果圈子下還有其他東西,他們也會被刪除。例如,在這個應用程序中,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