2016-09-15 48 views
1

出於某種原因,我的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

我同意。向我們展示您的堆棧跟蹤。 –

回答

3

您使用您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

1

我看到的唯一問題是如果您導入了ActionEvent。您正在使用awt,並且應該使用javafx ActionEvent。

import javafx.event.ActionEvent 

編輯1

您也不需要有動作事件作爲一個參數,如果你不需要它,只是一個供參考。

3

需要注意的是:

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."); 
     }