java - 如何在 javaFX 中对 GUI 应用最少的更改

标签 java javafx fxml scenebuilder fxmlloader

在 javaFX 中,是否有一种首选方法可以对 GUI 应用(小的)更改?我更喜欢使用 FXML 而不是以编程方式进行。

例如:应用程序以 VBox 中的背景和一些按钮启动(它们的排列方式与其在 FXML 文件中的定义相同)。

假设用户按下一个按钮(例如,在游戏中该按钮被命名为“多人游戏”),因此 GUI 必须更改以显示下一步。

在这个例子中,我想实现按钮被命名为其他名称,另一个按钮被替换为文本字段,并且可能会应用一些其他小的更改。但大多数 GUI 将保持不变,例如背景、VBox 本身和一些按钮。

我是否应该使用 vbox.getChildren().remove(button);vbox.getChildren().add(textField); 之类的东西以编程方式应用这些更改?但是为什么要使用 FXML 呢?我可以以编程方式完成整个 GUI,而不是仅加载起始 fxml 场景,然后以编程方式应用更改。

或者我应该从不同的 FXML 文件加载一个新场景,在 FXML 文件中进行这些更改。但是后来我注意到我的应用程序需要很长时间才能通过 FXMLLoader 加载新的 FXML 文件并短时间显示白屏。

或者我应该将我的 FXML 文件分成不同的层,这样我就可以,例如只用另一个 VBox 交换 VBox 而不是替换整个 GUI?但是我应该如何构建我的 GUI,我还能使用 SceneBuilder 吗?

可能我所有的方法都不是首选。那么我怎样才能很好地实现我的目标呢?

如果您想查看我当前的代码,我已将其发布在 this thread 中早些。

最佳答案

不是在 fxml 中定义 ButtonTextField,而是在其中定义一个容器,例如 Pane。然后在您的 Controller 中更改此 Pane 中必须包含的内容:

@FXML 
private Pane flexiblePane;

private Button myButton = new Button();
private TextField myTextField = new TextField();


private void displayFlexiblePaneAsButton(boolean flag) {
    if (flag) {
        flexiblePane.getChildren().clear();
        flexiblePane.getChildren().add(myButton);
    }
    else {
        flexiblePane.getChildren().clear();
        flexiblePane.getChildren().add(myTextField);
    }
}

关于java - 如何在 javaFX 中对 GUI 应用最少的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41318082/

相关文章:

java - Achilles 4.2.0编译错误 - 找不到符号symbol : class Table location: package info. archinnov.achilles.annotations

java - 无法将文本设置为 TextWatcher 中的 EditView

java - 滚动条 - block 增量似乎是可变的而不是固定的

java - JavaFX中是否有 'Scene Changed Listener'

java - 使用 javafx 播放音效/音乐的最佳选择是什么?

java - 选择第二个文本字段后 Runtime.getRuntime().exec 不起作用

java - 如何用多个wsdl文件生成一个services.xml

java - 如何在Libgdx中绘制一系列相连的线?

java - Netbeans 表示 observablearrayList 的 FXML 文件中不存在类,但它确实存在

java - 如何使用 FXML 在 JavaFX 中动态创建选项卡?