JavaFx 元素未绑定到 fx:id 上的控制器变量 [重复]

Posted

技术标签:

【中文标题】JavaFx 元素未绑定到 fx:id 上的控制器变量 [重复]【英文标题】:JavaFx element not binding to controller variable on fx:id [duplicate] 【发布时间】:2017-01-01 05:27:30 【问题描述】:

这可能是飞行员错误,但 FXML 属性未绑定到 fx:id 上的控制器类。我已经将其缩减为一个微不足道的例子,但仍然“不高兴”。我忽略了什么?

FXML 文件...

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>

<BorderPane fx:id="mainFrame" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.controller.BorderPaneCtrl">
  <left>
    <AnchorPane fx:id="anchorPaneLeft" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
  </left>
</BorderPane>

相关的 Java 代码是...

package sample.controller;

import javafx.fxml.FXML;
import javafx.scene.layout.AnchorPane;

public class BorderPaneCtrl 
    @FXML private AnchorPane anchorPaneLeft;

    public BorderPaneCtrl() 
        /* so, @FXML-annotated variables are accessible, but not
         *   yet populated
         */
        if (anchorPaneLeft == null) 
            System.out.println("anchorPaneLeft is null");
        
    

/* this is what was missing...added for "completeness"
 */
@FXML
public void initialize() 
    /* anchorPaneLeft has now been populated, so it's now
     *   usable
     */
    if (anchorPaneLeft != null) 
        // do cool stuff
    

自我在这里不是问题,我很确定我忽略了一些简单的事情。

【问题讨论】:

我在你的 BorderPaneCtrl 类中没有看到包。在 FXML 文件中,您有 sample.controller.BorderPaneCtrl 包声明在那里,但这不是问题。我注释了我的原始帖子以显示我缺少的内容。 【参考方案1】:

FXML 元素尚未在构造函数中分配,但您可以使用已分配元素的 Initializable 接口。

public class Controller implements Initializable 
    @FXML
    AnchorPane anchorPaneLeft;

    public Controller() 
        System.out.println(anchorPaneLeft); //null
    

    @Override
    public void initialize(URL location, ResourceBundle resources) 
        System.out.println(anchorPaneLeft); //AnchorPane
    

我假设您知道应该使用 FXML 创建控制器,例如:FXMLLoader.load(getClass().getResource("sample.fxml");

【讨论】:

前面的问题(在此线程顶部引用)正确解决了该问题。不需要实现 Initializable,但需要进行 FXML 注释的初始化,因为在调用构造函数之前不会填充绑定变量。格拉齐...

以上是关于JavaFx 元素未绑定到 fx:id 上的控制器变量 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX 中的 fx:id 和 id: 有啥区别?

从另一个场景切换启用/禁用 MenuItem javafx?

如何在对话框中将事件侦听器绑定到JavaFX TextFields。当字段为空时,“确定”按钮将被禁用,反之亦然

JAVAFX添加按钮事件备忘

javaFX树结构treeview使用

JavaFX:从线程更新控制器类中的 UI 元素