我刚刚开始学习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);
}
}
答案 0 :(得分:2)
在initialize()
方法中,使用新实例替换FXML文件中定义的Canvas
和StackPane
。因此,当您在actionButtonStart
方法中修改画布时,您不会初始化在FXML中定义并在UI中显示的画布。
从initialize
方法中删除行,它可能会有效。
您没有发布FXML文件的代码,但我猜想FXML文件已经将画布添加到堆栈窗格中。如果是这样的话,行
windowHolder.getChildren().add(mainCanvas)
将在运行时生成错误(因为画布现在已添加两次)。您应该在FXML中将画布添加到堆栈窗格,并从操作处理程序中删除该行。
同时查看Controller Method Event Handlers并确保您通过ActionButtonStart
从fxml引用onAction="#ActionButtonStart"
。遵循Java方法名称约定也是一个好主意(例如,调用方法actionButtonStart
而不是ActionButtonStart
)。