JavaFx fx:id导致错误

时间:2016-09-15 13:28:36

标签: java javafx fxml

出于某种原因,我的fx:id没有正确绑定到我的Controller类,因此总是会导致错误。

控制器

package sample;

import javafx.fxml.FXML;

import java.awt.*;
import java.awt.event.ActionEvent;

public class Controller {

    @FXML public Button button;

    public void clickAction(ActionEvent actionEvent) {
        System.out.println("Button clicked.");
    }
}

FXML

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

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<BorderPane fx:controller="sample.Controller" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <Button text="Click me!" fx:id="button" onAction="#clickAction" BorderPane.alignment="CENTER"/>
</BorderPane>

我想我理解问题的根源,但我不明白如何正确解决它。根据{{​​3}}的回答,我想我在调用构造函数之前尝试分配FXML元素(这些元素只能在初始化期间/之后分配)。

有没有办法在没有实施Initializable的情况下执行?或者我犯了一个完全不同的错误?

4 个答案:

答案 0 :(得分:3)

您使用导入

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

在你的fxml文件中。

因此,加载fxml文件时创建的Button实例为javafx.scene.control.Button

注入的字段类型需要javafx.scene.control.Button可以分配给它。

由于您javafx.fxml.FXML以外的控制器中的唯一导入来自java.awt个包,因此button字段(类型java.awt.Button)显然不是这种情况。< / p>

修复您的控制器以从javafx包中导入所需的类:

import javafx.fxml.FXML;

import javafx.scene.control.Button;
import javafx.event.ActionEvent;

BTW:如果你不使用它,你也可以省略onAction处理程序的参数:

public void clickAction() {
    System.out.println("Button clicked.");
}

答案 1 :(得分:3)

  

请注意:

1)您在导入语句中使用了旧的Swing

2)你需要在每个使用fxml定义的id的方法和元素上添加@FXML

  

您的代码应为:

import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.event.ActionEvent;

public class Controller {

    @FXML
     public Button button;

     @FXML
    public void clickAction(ActionEvent actionEvent) {
        System.out.println("Button clicked.");
    }
}
  

另请注意,FabianMichael在他们的答案中说了   不需要ActionEvent actionEvent进入clickAction方法。所以   finnally:

 @FXML
        public void clickAction() {
            System.out.println("Button clicked.");
        }

答案 2 :(得分:1)

如果导入ActionEvent,我看到的唯一问题。你正在使用awt,应该使用javafx ActionEvent。

import javafx.event.ActionEvent
  

编辑1

如果你不需要它,你也不需要将ActionEvent作为参数,只需要一个FYI。

答案 3 :(得分:0)

最近,我认为我也遇到了类似的问题。 FXML给我错误。原因是导入的库不正确。 相反,我导入了java.scene.control

看看可能性:

enter image description here