在运行JavaFX应用程序的情况下,打开一个具有自己的独立控制器类的新窗口

在运行JavaFX应用程序的情况下,打开一个具有自己的独立控制器类的新窗口,java,netbeans,javafx-2,fxml,scenebuilder,Java,Netbeans,Javafx 2,Fxml,Scenebuilder,我正在将SceneBuilder与Netbeans的JavaFX库一起用于这个项目。我使用Scenebuilder为控制器类创建fxml和netbeans。我们的目标是构建一个相当复杂的应用程序来进行部署 我可以启动一个JavaFX应用程序并很好地连接控制器类。然而,当我试图打开一个新窗口时,我似乎无法将控制器类绑定到新窗口。为了简单起见,由于后端复杂,我希望为新窗口提供一个单独的控制器类 TL;DR--尝试使用控制器类在JavaFX应用程序上打开一个新窗口。控制器类未绑定。 下面是代码示例 模

我正在将SceneBuilder与Netbeans的JavaFX库一起用于这个项目。我使用Scenebuilder为控制器类创建fxml和netbeans。我们的目标是构建一个相当复杂的应用程序来进行部署

我可以启动一个JavaFX应用程序并很好地连接控制器类。然而,当我试图打开一个新窗口时,我似乎无法将控制器类绑定到新窗口。为了简单起见,由于后端复杂,我希望为新窗口提供一个单独的控制器类

TL;DR--尝试使用控制器类在JavaFX应用程序上打开一个新窗口。控制器类未绑定。

下面是代码示例

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

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文件

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();
    }
}
java——extends Initializable,是Sample.fxml的控制器类。下面是我试图打开名为“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--实现可初始化

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

ServerConfigChooser类中使用构造函数的原因是我无法自动启动initialize()方法。我在构造函数中手动启动该方法


欢迎使用任何解决方案!

这里的问题可能是如何加载
ServerConfigChooser
(我感觉FXML被加载了两次或类似的内容)。以下应该可以工作:

try {
    FXMLLoader loader = new FXMLLoader(getClass().getResource("ServerConfigChooser.fxml"));
    ServerConfigChooser controller = new ServerConfigChooser();
    loader.setController(controller);
    Parent root = (Parent) loader.load();

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

另外,请检查您是否未在
ServerConfigChooser.fxml
中指定
fx:controller
(可能冲突,实际上没有尝试过)。

不要像那样加载两次fxml。您可以多次加载相同的.fxml文档(多个场景图/控制器)但是,如果要同时加载场景图和初始化控制器,只需调用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);
    }
注意

  • 控制器应扩展.fxml文档根节点的节点类型
  • .fxml文档应使用fxroot构造,请参见(您可以在场景生成器中设置)
  • 您应该从fxml根元素中删除控制器。它将与使用
    FXMLLoader
    类的这种方式冲突
例如控制器类

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


JavaFX现在就必须这样做。希望在不久的将来内存泄漏会被修复。在周日发帖通常是一周中最不活跃的时间。等待周一,以获得更好的结果