使用正在运行的JavaFX应用程序,使用自己独立的控制器类打开一个新窗口

Kyt*_*yte 7 java netbeans javafx-2 fxml scenebuilder

我正在将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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Sample.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)
Run Code Online (Sandbox Code Playgroud)

ServerConfigChooser.java - 实现Initializable

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

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

欢迎任何解决方案!

tho*_*s.g 8

不要像这样加载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);
    }
Run Code Online (Sandbox Code Playgroud)

注意

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

例如控制器类

public class ServerConfigChooser extends AnchorPane implements Initializable {
   ...
}
Run Code Online (Sandbox Code Playgroud)

和.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">