出于某种原因,我的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
的情况下执行?或者我犯了一个完全不同的错误?
答案 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.");
}
}
另请注意,
Fabian
和Michael
在他们的答案中说了 不需要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)