2014-03-25 80 views
0

我剛開始學習JavaFx。對於基本問題抱歉,但我在這裏呆了幾天。JavaFX:canvas不顯示任何內容

我構建了一個基於FXML的項目,並且希望在Canvas中顯示某些內容。畫布嵌入在一個堆棧窗格中,堆棧窗格嵌入在FXML窗口中。窗口中有一個按鈕,當我點擊它時,畫布應該顯示一些形狀。

現在的問題是,畫布不顯示任何東西。 ActionButtonStart是按鈕操作方法。非常感謝!!

public class MainController implements Initializable{ 
    @FXML 
    private StackPane windowHolder; 
    @FXML 
    private Canvas mainCanvas; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     mainCanvas = new Canvas(); 
     windowHolder = new StackPane(); 
    } 

    public void ActionButtonStart(ActionEvent event){ 
     //WindowNavigator.loadWindow(WindowNavigator.WINDOW_1_Welcome); 
     final GraphicsContext gc = mainCanvas.getGraphicsContext2D(); 
     gc.clearRect(0, 0, mainCanvas.getWidth(), mainCanvas.getHeight()); 

     gc.setFill(Color.BLACK); 
     gc.setFont(Font.getDefault()); 
     gc.fillText("hello world!", 15, 50); 

     gc.setLineWidth(5); 
     gc.setStroke(Color.PURPLE); 

     gc.strokeOval(10, 60, 30, 30); 
     gc.strokeOval(60, 60, 30, 30); 
     gc.strokeRect(30, 100, 40, 40); 

       windowHolder.getChildren().add(mainCanvas); 
    } 

    public void setWindow(Node node) { 
     windowHolder.getChildren().setAll(node); 
    } 

} 

回答

2

在你initialize()方法,更換Canvas,並與新的情況下,您的FXML文件中定義的StackPane。因此,當您修改actionButtonStart方法中的畫布時,您並未初始化FXML中定義的畫布並顯示在UI中。

initialize方法中刪除行,它可能會工作。

您沒有發佈FXML文件的代碼,但我猜想FXML文件已經將畫布添加到堆棧窗格。如果是這種情況,行

windowHolder.getChildren().add(mainCanvas) 

將在運行時生成錯誤(因爲畫布現在被添加兩次)。您應該將畫布添加到FXML中的堆棧窗格中,並將該行從操作處理程序中刪除。

也審查Controller Method Event Handlers,並確保您通過onAction="#ActionButtonStart"從您的fxml引用ActionButtonStart。遵守Java方法名稱約定也是一個好主意(例如,調用您的方法actionButtonStart而不是ActionButtonStart)。