Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX:canvas不显示任何内容_Canvas_Javafx 2_Fxml - Fatal编程技术网

JavaFX:canvas不显示任何内容

JavaFX:canvas不显示任何内容,canvas,javafx-2,fxml,Canvas,Javafx 2,Fxml,我刚开始学习JavaFx。很抱歉问了一个基本的问题,我被困在这里好几天了 我构建了一个基于FXML的项目,并希望在画布中显示一些内容。画布嵌入在stackpane中,stackpane嵌入在FXML窗口中。窗口中有一个按钮,当我单击它时,画布应该会显示一些形状 现在的问题是,画布不显示任何内容操作按钮开始是按钮操作方法。非常感谢 public class MainController implements Initializable{ @FXML private StackPan

我刚开始学习JavaFx。很抱歉问了一个基本的问题,我被困在这里好几天了

我构建了一个基于FXML的项目,并希望在画布中显示一些内容。画布嵌入在stackpane中,stackpane嵌入在FXML窗口中。窗口中有一个按钮,当我单击它时,画布应该会显示一些形状

现在的问题是,画布不显示任何内容<代码>操作按钮开始是按钮操作方法。非常感谢

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);
    }   

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

initialize
方法中删除这些行,它可能会工作

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

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

同时检查并确保您正在通过
onAction=“#ActionButtonStart”
从fxml中引用
ActionButtonStart
。遵守Java方法名称约定也是一个好主意(例如,调用您的方法
actionButtonStart
,而不是
actionButtonStart