Javafx - 应用程序类可以是控制器类吗

2023-12-20

我目前正在自学 JavaFX,并且我已经采用了一个简单的示例程序,该程序对视图进行了硬编码,并将其转换为使用 FXML 的程序(主要是为了我可以使用 SceneBuilder 来构建 UI)。我没有编写单独的控制器类,而是使用应用程序类(因此有 1 个 Java 文件和 1 个 FXML 文件)。我没有使用initialize()方法,因为它是线性流程(显示 UI、填充字段、等待输入)。视图弹出,但随后应用程序出错,因为没有任何控件映射到适当的变量(因此对于@FXML TableView<...> table, table is null).

但是,我输入了一个initialize()调试方法,在中时注入控件initialize(),然后返回 nullinitialize() exits.

那么问题是,JavaFX 是否将应用程序类的新实例实例化为单独的控制器类?这可以解释为什么变量超出范围。或者是其他什么(例如,仅在从 JavaFX 操作回调时才注入控件)?


默认行为FXMLLoader是创建控制器类的新实例并使用该实例作为控制器。

具体来说,FXMLLoader做类似的事情:

  • Read the root FXML element.
    • If the root FXML element has a fx:controller attribute, then
      • If a controller already exists, throw an exception, otherwise create an instance of the specified class1 and set that as the controller
  • 继续解析 FXML 文件。如果元素有一个fx:id属性,并且控制器存在(通过任何机制),将这些字段注入到控制器中。类似地,将事件处理程序注册为对控制器实例中的方法的调用。
  • Invoke initialize()在控制器上,如果控制器存在并且它有这样的方法。

所以,你问的问题是:

应用程序类可以是控制器类吗

是的,但这可能是一个糟糕的主意。如果您简单地指定Application子类作为控制器类使用fx:controller,然后是第二个实例Application子类被创建,@FXML- 带注释的字段被注入到第二个实例上,并且initialize()在第二个实例上调用方法。显然,@FXML-字段永远不会在其实例上初始化start(...)被调用,并且initialize()永远不会在该实例上调用方法。

你的意思可能是:

启动时创建的应用程序类实例可以用作控制器吗?

答案也是肯定的,除了您打算立即丢弃的非常小的演示程序之外,这也可能是一个非常糟糕的主意。你会这样做

public class MyApp extends Application {

    @FXML
    private Node someNode ;

    public void initialize() {
        // do something with someNode 
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/path/to/fxml/file.fxml"));
        loader.setController(this);
        Parent root = loader.load();
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
}

请注意,要使用此代码,您的 FXML 文件must not have a fx:controller属性。

这样做的问题是你没有分离性,也没有灵活性。 (例如,如果您在 FXML 文件中的某个位置创建了视图的第二个实例,那么您最终会得到第二个实例Application子类实例,这充其量是违反直觉的(一个应用程序有两个Application实例...).)

因此,我主张基本上在每种情况下都为控制器使用单独的类。这Application子类应包含最少的代码,并且仅用于启动应用程序。

1 This step is actually a little more complex. If a class is specified in the fx:controller attribute, and no controller already exists, the FXMLLoader checks for a controllerFactory http://docs.oracle.com/javase/8/javafx/api/javafx/fxml/FXMLLoader.html#setControllerFactory-javafx.util.Callback-. If one exists, then the controller is set as the result of passing the specified Class to the controllerFactory's call() method, otherwise it is created by calling newInstance() on the specified class (effectively calling its no-argument constructor).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javafx - 应用程序类可以是控制器类吗 的相关文章

  • 使用 PixelWriter 在 JavaFX Canvas 上进行透明绘图

    有谁知道为什么使用drawImage 在Canvas上进行透明度绘制工作得很好 但在PixelWriter上却根本不起作用 我最初认为这可能与画布 上下文上的混合或其他模式 设置有关 但还没有任何运气 我需要每个像素的可变透明度 而不是整个
  • 将两个表视图绑定在一起,以便它们同步滚动

    我想将两个表视图绑定在一起 以便它们同步滚动 我怎么做 我无法找到如何访问表格视图的滚动条 我做了一个CSS hack来将Tableview与外部滚动条绑定 一个滚动条控制两个表格视图 我的想法的概述 创建两个表视图 制作一个垂直滚动条 在
  • 有没有办法设置独立 TableView 列的样式?

    我可以使用 CSS 来设置单元格样式 但如果我只想为一列使用不同的样式 例如使用不同的文本颜色 怎么办 也许我错过了一些东西 你应该使用TableColumn setCellFactory http docs oracle com java
  • 如何使用 Java 11 和 JavaFX 11 运行 ControlsFX 示例应用程序

    ControlFX 网站 http fxexperience com controlsfx says 如果您想使用 ControlsFX 示例应用程序 只需 下载 ControlsFX 版本并在上运行以下命令 命令提示符 请务必将 替换为实
  • FXML 文档拒绝导入其他 fxml 文件

    我的程序有一个主要的 FXML 文档 其中包含TabPane 对于每个选项卡 我希望它有自己的控制器和 fxml 文件 当我尝试将外部 fmxl 文件包含到主 fxml 文档中时 我的程序拒绝运行 这是我的主要 FXML 文档 这是我的 j
  • 如何在JavaFX中获得一个小的ProgressBar

    我正在尝试获得一个类似 iTunes 的进度条 该进度条非常小 高度约为 5 像素 但我似乎无法低于 19 或 20 像素 我尝试在周围的窗格上设置 fx max height 但没有效果 请注意 这个值确实会改变高度 我只是不能让它小于大
  • JavaFx ComboBox 绑定混乱

    我有一个 I18N 实现 它通过属性绑定 JavaFX UI 元素 例如 def translateLabel l Label key String args Any Unit l textProperty bind createStrin
  • 如何使用 javafx 创建响应式文本?

    我创建了一个标签 其中显示了一个数字 现在我想让这个数字响应 GUI 我怎样才能做到这一点 这是我的号码及其当前字体大小 Label label new Label label setText 12 label setFont Font f
  • 在 Jar 中为 Gluon Scene Builder 11.00 创建自定义控件

    我想在可执行 jar 文件中创建自定义控件 然后在 Gluon Scene Builder 11 00 中使用 我需要知道如何做到这一点 我尝试了几种形式 但在场景生成器中导入 jar 时我的控件没有出现 我正在使用 IntelliJ Co
  • JavaFX - Outlook 附件 - DnD

    您好 我需要一个 DnD 解决方案来将 Outlook 邮件附件拖到堆栈窗格中 JavaFX Outlook 2010 stackpaneDragAndDropZone setOnDragOver DragEvent event gt Dr
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • JavaFX 中的 fx:id 和 id: 有什么区别?

    也许是一个真正的新手的问题 我开始通过阅读以下教程在 FMXL 应用程序中使用场景生成器学习 JavaFX http docs oracle com javase 8 javafx get started tutorial fxml tut
  • 标签文字位置

    我有一个带有图像和文本的标签 final Label label new Label labelText label setTextAlignment TextAlignment CENTER ImageView livePerformIc
  • Javafx 组合框不会在实时更改时更新下拉列表大小?

    我正在使用 Javafx v8 0 25 b18 我出现的问题是动态组合框的下拉列表的大小不会改变 所以如果我最初在下拉列表中有两个项目 那么下拉列表大小将适合两个项目 但如果我现在用以下内容填充动态组合框三个项目 然后我在里面得到一个小滚
  • ListChangeListener wasPermutated 块

    ListChangeListener 的 JavaDoc 提供了用于处理更改的模板 但是 我不知道如何处理排列 对于每个索引 我都可以找到该项目的新索引在哪里 但我不知道如何处理它 这是一个独立于编程语言的难题 ObservableList
  • Java NoSuchMethodException - 类中确实存在方法

    我正在构建一个 JavaFx 应用程序 我想创建一个接收 GridPane 和 Node 以及添加到窗格中的项目数量的方法 但是 当我调用该方法时 我收到 NoSuchMethodException 作为测试 我尝试创建一个简单的方法pri
  • 在 JavaFX 中更改 ListView 字体大小

    我想知道如何更改 JavaFx 中的列表视图项目文本字体大小 每行文本的大小会有所不同 我尝试使用细胞因子属性 但我不知道如何使用它 有人可以帮我吗 类似的问题在这里 如何更改JavaFX中ListView的字体大小 https stack
  • 如何在谓词中对 FilteredList 结果进行优先级排序/排名?

    我的应用程序包含一个TextField and a ListView The TextField允许用户输入搜索词来过滤内容ListView当他们打字时 过滤过程将匹配每个字段中的多个字段DataItem in the ListView如果
  • JavaFX 打印自定义纸张尺寸

    在 JavaFX 中 我想将照片打印到 10x15 的纸张上 有一些纸张常数 但没有 100x150 mm 常数 是否可以创建自己的纸张以在页面布局中使用它 Thanks PageLayout pageLayout printer crea
  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml

随机推荐