JavaFX:canvas不显示任何内容

时间:2014-03-25 18:32:15

标签: canvas javafx-2 fxml

我刚刚开始学习JavaFx。对不起基本问题,但我被困在这里几天了。

我构建了一个基于FXML的项目,并希望在Canvas中显示某些内容。 Canvas嵌入在堆栈窗格中,堆栈窗口嵌入在FXML窗口中。窗口中有一个按钮,当我单击它时,Canvas应显示一些形状。

现在的问题是,Canvas没有显示任何内容。 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);
    }   

}

1 个答案:

答案 0 :(得分:2)

initialize()方法中,使用新实例替换FXML文件中定义的CanvasStackPane。因此,当您在actionButtonStart方法中修改画布时,您不会初始化在FXML中定义并在UI中显示的画布。

initialize方法中删除行,它可能会有效。

您没有发布FXML文件的代码,但我猜想FXML文件已经将画布添加到堆栈窗格中。如果是这样的话,行

windowHolder.getChildren().add(mainCanvas)

将在运行时生成错误(因为画布现在已添加两次)。您应该在FXML中将画布添加到堆栈窗格,并从操作处理程序中删除该行。

同时查看Controller Method Event Handlers并确保您通过ActionButtonStart从fxml引用onAction="#ActionButtonStart"。遵循Java方法名称约定也是一个好主意(例如,调用方法actionButtonStart而不是ActionButtonStart)。