gpt4 book ai didi

java - 使用正在运行的 JavaFX 应用程序,打开一个带有自己的独立 Controller 类的新窗口

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:15:39 25 4
gpt4 key购买 nike

我将 SceneBuilder 与 Netbeans 的 JavaFX 库结合用于此项目。我使用 Scenebuilder 为 Controller 类创建 fxml 和 netbeans。目标是构建一个相当复杂的要部署的应用程序。

我可以启动 JavaFX 应用程序并连接 Controller 类。但是,当我尝试打开一个新窗口时,我似乎无法将 Controller 类绑定(bind)到新窗口。由于后端复杂,为了简单起见,我想为新窗口设置一个单独的 Controller 类。

TL;DR -- 尝试在带有 Controller 类的 JavaFX 应用程序上打开一个新窗口。 Controller 类没有绑定(bind)。

下面的代码示例

模型类——启动应用程序的包装器

public class Model extends Application{
public static void main(String[] args){
Application.launch(Model.class, args);
}
@Override
public void start(Stage stage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("Sample.fxml"));
stage.setScene(new Scene(root));
stage.show();
}
}

Sample.fxml -- 主应用程序的 fxml 文件

Sample.java -- 扩展 Initializable,是 Sample.fxml 的 Controller 类。下面是我尝试打开标题为“ServerConfigChooser

”的新窗口的代码片段
try{
Parent root = FXMLLoader.load(getClass().getResource("ServerConfigChooser.fxml"));
FXMLLoader loader = new FXMLLoader(getClass().getResource("ServerConfigChooser.fxml"));
ServerConfigChooser controller = new ServerConfigChooser();

loader.setController(controller);
loader.setRoot(root);

Stage stage = new Stage();
stage.setScene(new Scene(root));
stage.show();
} catch (IOException ex)

ServerConfigChooser.java -- 实现 Initializable

这是我遇到的问题。我不能简单地声明与 .fxml 文件中的变量具有相同 fxid 的变量。调用类时不会触发 initialize() 方法。

ServerConfigChooser 类中的构造函数的原因是我无法自动触发 initialize() 方法。我在构造函数中手动触发它。

欢迎任何解决方案!

最佳答案

不要像那样加载 FXML 两次。您可以多次加载相同的 .fxml 文档(多个场景图/ Controller ),但如果您想同时加载场景图和初始化 Controller ,您只需调用一次 fxml 加载器。

举个例子

    FXMLLoader loader = new FXMLLoader(getClass().getResource("ServerConfigChooser.fxml"));
ServerConfigChooser controller = new ServerConfigChooser();
loader.setController(controller);
loader.setRoot(controller);
Parent root;
try {
root = (Parent) loader.load();
Scene scene = new Scene(root, 320, 200);
Stage stage = new Stage();
stage.setScene(scene);
stage.show();
} catch (IOException ex) {
Logger.getLogger(ServerConfigChooser.class.getName()).log(Level.SEVERE, null, ex);
}

注意

  • 您的 Controller 应该扩展您的 .fxml 文档的根节点的节点类型
  • 您的 .fxml 文档应该使用 fxroot 结构,参见 this doc (你可以在场景生成器中设置)
  • 您应该从 fxml 根元素中删除 Controller 。它会与这种使用FXMLLoader的方式发生冲突。类

例如 Controller 类

public class ServerConfigChooser extends AnchorPane implements Initializable {
...
}

还有.fxml

<fx:root type="javafx.scene.layout.AnchorPane" id="AnchorPane" prefHeight="200.0" prefWidth="320.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">

关于java - 使用正在运行的 JavaFX 应用程序,打开一个带有自己的独立 Controller 类的新窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21223893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com