当前位置: 首页 > 知识库问答 >
问题:

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

孙文康
2023-03-14

在这个项目中,我将SceneBuilder与Netbean的JavaFX库结合使用。我使用Scenebuilder为控制器类创建fxml和netbean。目标是构建一个要部署的相当复杂的应用程序。

我可以启动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文件

示例.java -- 扩展可初始化,是示例.fxml 的控制器类。下面是我尝试打开标题为“服务器配置浏览器”的新窗口的代码片段

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类中使用构造函数的原因是我无法自动触发初始化()方法。我在构造函数中手动触发它。

欢迎任何解决方案!

共有2个答案

郗福
2023-03-14

这里的问题可能是你如何加载服务器配置选择器(我感觉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(...) {...}

还要检查您是否没有在服务器配置中选择者.fxml中指定fx:控制器(可能冲突,实际上尚未尝试过)。

红甫
2023-03-14

不要像那样两次加载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构造,请参阅此文档(可以在scene builder中设置)
  • 您应该从fxml根元素中删除控制器。它将与使用FXMLLoader类的这种方式冲突

例如控制器类

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

和 .fxml

<代码>

 类似资料:
  • 问题内容: 当您运行/调试它们时,是否可以将eclipse配置为在新窗口中打开控制台应用程序而不是其自己的控制台? 我正在调试客户端/服务器应用程序,我想一次看到两个应用程序的输出,而不必在选项卡之间切换… 问题答案: 在eclipse中,您可以有两个控制台视图…在控制台视图上,您​​有一个名为“打开控制台”的按钮(控制台视图中最右边的按钮)。如果单击此按钮并选择选项3(新控制台视图),将看到两个

  • 我目前正在Spring Boot 2.4.0中编写一个应用程序,它需要侦听多个端口(具体来说是3个-但将来可能是4个)。这个想法是每个端口都提供不同的API供其他服务/应用程序连接到它。 所以,对于一个最小的工作示例,我会说我们有一个像这样的SpringBootApp: 现在,我想让它在3个不同的端口上监听,比如8080、8081和8082。所有人(!)对其中一个端口的请求,应由特定控制器“负责”

  • 问题内容: 我知道如何更新自己的程序,也知道如何使用预定义的Uri打开程序(例如,用于短信或电子邮件) 我需要知道如何创建一个意图来打开MyTracks或其他我不知道他们在听什么意图的应用程序。 我是从DDMS获得此信息的,但是我并没有成功将其转换为可以使用的Intent。这是从手动打开MyTracks时获取的。 谢谢你的帮助 问题答案: 首先,Android中的“应用程序”概念是一个扩展的概念。

  • 我是Eclipse java、Gradle和JavaFX新手。最近我正在尝试用gradle Project编写一个javafx应用程序。以下是我想提供的各种细节。 Javafx SDK版本和位置 Scene Builder版本和位置 ui.fxml: Build.Gradle 我怀疑这里有一些问题,因为当我运行gradle项目时,我不能运行它。我只能建造它。 当我运行这个时,我得到了相当多的错误。

  • 问题内容: 有什么办法可以使可执行文件.jar双击后打开命令行? 我正在制作一个基于文本的冒险游戏。截至目前,它只是带有房间的迷宫。最终它将变得更大,更深入,但是现在我只想了解基本结构。无论如何,要完成这项工作,我一直在从System.out.printf命令和java.util.Scanner获取输出和输入。到目前为止,所有功能都运行良好,但是当我尝试将其发送给不知道如何或者不想从命令行运行程序

  • 在我的JavaFX FXML应用程序中,我希望当用户单击主窗口中的某个菜单项时弹出一个辅助窗口,这样用户就可以在其中输入一些输入,然后在单击按钮时将这些输入提供给应用程序,并且辅助窗口将被关闭。 所有的教程都有点离谱。它们描述了如何在纯JavaFX中实现这一点,这显然不同于您在FXML中使用的方式,或者它们解释了如何切换场景,这将关闭旧场景。我想这应该很简单,可以定义FXML布局及其控制器,用它们