JavaFX Controller未初始化UI字段

时间:2015-01-09 16:50:04

标签: java javafx

我正在通过Scene Builder开发一个JavaFX项目。 我创建了一个很长的FXML文件(我只报告一个片段)和相关的控制器。此外,我编写了我的Application类:

public class Main extends Application {
    @Override
    public void start(Stage stage) {
        Parent root;
        try {
            root = FXMLLoader.load(getClass().getResource("myfxml.fxml"));
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }

        Scene scene = new Scene(root);

        stage.setTitle("Popolamento dati Ambasciata");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

FXML:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>

<GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="1150.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.FXController">
    ...
<children>
        <Button id="addobject" mnemonicParsing="false" onAction="#addobject" text="Add Object" GridPane.columnIndex="1" GridPane.halignment="CENTER" GridPane.rowIndex="10" />
        <TextField id="objectname" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="1" />

控制器:

public class FXController {

@FXML Button addobject;
@FXML TextField objectname;

@FXML
public void addobject() {
    objectname.getText();
}
}

}

应用程序正确启动并调用事件处理程序,但在访问TextField对象名时,它为null。 我在哪里做错了?

1 个答案:

答案 0 :(得分:4)

您应该使用fx:id属性而不是id

如果查看文档here

  

为元素分配fx:id值会在文档的命名空间中创建一个变量,以后可以通过变量解除引用属性引用该变量

请注意,您仍然可以使用id属性:

  

此外,如果对象的类型定义了“id”属性,则该值也将传递给对象setId()方法。

所以在你的情况下:

<Button fx:id="addobject" ... />
<TextField fx:id="objectname" ... />