IntelliJ IDE中JavaFX Controller无法检测识别FXML绑定对象问题
JavaFX计算器项目Controller层对象识别异常问题
项目背景
首次使用JavaFX开发计算器项目,同步尝试编写CSS样式,参考基础教程完成代码后,在Controller层遇到对象无法识别的问题。
相关代码
Main类代码
package app; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception{ Parent root = FXMLLoader.load(getClass().getResource("mainFX.fxml")); Scene sceneMain = new Scene(root); primaryStage.setScene(sceneMain); //scene setup String css = this.getClass().getResource("calcFX.css").toExternalForm(); sceneMain.getStylesheets().add(css); //adding css primaryStage.setResizable(false); primaryStage.setTitle("CalcFX"); primaryStage.show(); } public static void main(String[] args) { launch(args); } }
Controller类代码
package app; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Label; import javafx.scene.text.Text; public class Controller { private Text text = new Text(""); @FXML private Label display; display.setText(text); }
FXML文件代码
<?import javafx.scene.control.Button?> <?import javafx.scene.control.Label?> <?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.ColumnConstraints?> <?import javafx.scene.layout.GridPane?> <?import javafx.scene.layout.RowConstraints?> <AnchorPane id="pane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="450.0" prefWidth="350.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="app.Controller"> <children> <Label id="display" layoutX="25.0" layoutY="15.0" prefHeight="200.0" prefWidth="300.0" text="" /> <GridPane hgap="6.0" layoutX="25.0" layoutY="225.0" prefHeight="200.0" prefWidth="300.0" vgap="6.0"> <columnConstraints> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="45.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="45.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="45.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="45.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="45.0" /> <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="45.0" /> </columnConstraints> <rowConstraints> <RowConstraints minHeight="10.0" prefHeight="45.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="45.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="45.0" vgrow="SOMETIMES" /> <RowConstraints minHeight="10.0" prefHeight="45.0" vgrow="SOMETIMES" /> </rowConstraints> <children> <Button id="b0" mnemonicParsing="false" onAction="#Press0" prefHeight="45.0" prefWidth="45.0" stylesheets="@calcFX.css" text="0" GridPane.columnIndex="1" GridPane.rowIndex="3" /> <Button id="b1" mnemonicParsing="false" onAction="#Press1" prefHeight="45.0" prefWidth="45.0" stylesheets="@calcFX.css" text="1" GridPane.rowIndex="2" /> <Button id="b2" mnemonicParsing="false" onAction="#Press2" prefHeight="45.0" prefWidth="45.0" stylesheets="@calcFX.css" text="2" GridPane.columnIndex="1" GridPane.rowIndex="2" /> <Button id="b3" mnemonicParsing="false" onAction="#Press3" prefHeight="45.0" prefWidth="45.0" stylesheets="@calcFX.css" text="3" GridPane.columnIndex="2" GridPane.rowIndex="2" /> </children> </GridPane> </children> </AnchorPane>
问题描述
尝试引用Label类型的display对象时,IDE提示该对象未定义,Text类型的text元素也无法被IDE正确识别为Text对象。
问题排查结果
共两处问题,修复后问题解决:
- 语法不符合规范:执行语句
display.setText(text);直接写在类作用域下,Java要求可执行语句必须放在方法、构造器或代码块中,FXML组件注入完成后需要执行的初始化操作可以放在initialize()方法中。 - FXML绑定错误:FXML文件中Label组件使用
id="display"声明,而@FXML注解依赖fx:id完成组件注入,需要将Label的属性修改为fx:id="display"。
内容的提问来源于stack exchange,提问作者Atan
相关产品推荐
相关产品推荐

