JavaFx fx:id导致错误

问题描述:

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

控制器

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> 

我想我明白我的问题的根源,但我不知道如何正确地解决这一问题。根据this question的回答,我想我正在调用构造函数之前分配FXML元素(并且这些元素只能在初始化期间/之后分配)。

有没有办法做到这一点没有实施Initializable?还是我犯了一个完全不同的错误?

+2

Erhm,什么样的错误? –

+0

我同意。向我们展示您的堆栈跟踪。 –

您使用您FXML文件进口

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

因此在加载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; 

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

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

太棒了。我猜想,当Intellij建议我进口时,我只是不加思索地进入。谢谢! – user3668541

我看到的唯一问题是如果您导入了ActionEvent。您正在使用awt,并且应该使用javafx ActionEvent。

import javafx.event.ActionEvent 

编辑1

您也不需要有动作事件作为一个参数,如果你不需要它,只是一个供参考。

需要注意的是:

1)您在import语句中使用旧Swing

2)你需要在每一个方法和元素与ID使用FXML

定义添加 @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表示,他们的回答你 不NE ED的ActionEvent动作事件到clickAction method.So finnally:

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