JavaFx fx:id 导致错误
JavaFx fx:id causes error
出于某种原因,我的 fx:id 没有正确绑定到我的 Controller
class,因此总是会导致错误。
控制器
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>
我想我明白问题的根源,但我不知道如何正确解决它。根据 的回答,我想我正在尝试在调用构造函数之前分配 FXML 元素(并且这些元素只能分配 during/after 初始化)。
有没有办法无需实现Initializable
?还是我犯了一个完全不同的错误?
我看到的唯一问题是您导入了 ActionEvent。您正在使用 awt,应该使用 javafx ActionEvent。
import javafx.event.ActionEvent
Edit 1
如果不需要,也不需要将 ActionEvent 作为参数,仅供参考。
您使用进口
<?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
)显然不是这种情况.
修复您的控制器,改为从 javafx
包中导入所需的 类:
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.event.ActionEvent;
顺便说一句:您也可以省略 onAction
处理程序的参数,如果您不使用它:
public void clickAction() {
System.out.println("Button clicked.");
}
Note that:
1)您在导入语句中使用了旧的 Swing
库
2)您需要在使用 fxml
定义的每个方法和元素上添加 @FXML
Your code should be:
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.");
}
}
Also mention that as Fabian
and Michael
said on their answers you
don't need ActionEvent actionEvent into the clickAction method.So
finnally:
@FXML
public void clickAction() {
System.out.println("Button clicked.");
}
最近,我想我遇到了类似的问题。
FXML 给我错误。原因是错误导入的库。
相反 java.scene.control
,我导入了 java.awt
.
看看可能性:
出于某种原因,我的 fx:id 没有正确绑定到我的 Controller
class,因此总是会导致错误。
控制器
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>
我想我明白问题的根源,但我不知道如何正确解决它。根据
有没有办法无需实现Initializable
?还是我犯了一个完全不同的错误?
我看到的唯一问题是您导入了 ActionEvent。您正在使用 awt,应该使用 javafx ActionEvent。
import javafx.event.ActionEvent
Edit 1
如果不需要,也不需要将 ActionEvent 作为参数,仅供参考。
您使用进口
<?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
)显然不是这种情况.
修复您的控制器,改为从 javafx
包中导入所需的 类:
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.event.ActionEvent;
顺便说一句:您也可以省略 onAction
处理程序的参数,如果您不使用它:
public void clickAction() {
System.out.println("Button clicked.");
}
Note that:
1)您在导入语句中使用了旧的 Swing
库
2)您需要在使用 fxml
定义的每个方法和元素上添加@FXML
Your code should be:
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.");
}
}
Also mention that as
Fabian
andMichael
said on their answers you don't need ActionEvent actionEvent into the clickAction method.So finnally:
@FXML
public void clickAction() {
System.out.println("Button clicked.");
}
最近,我想我遇到了类似的问题。
FXML 给我错误。原因是错误导入的库。
相反 java.scene.control
,我导入了 java.awt
.
看看可能性: