JavaFx fx:id вызывает ошибку

По какой-то причине мой 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>

Я думаю, что понимаю источник моей проблемы, но я не понимаю, как правильно ее решить. В соответствии с ответом на этот вопрос, я думаю, что я пытаюсь назначить элементы FXML до вызова конструктора (и эти элементы могут быть назначены только во время / после инициализации).

Есть ли способ сделать это без реализации Initializable? Или я совершаю совершенно другую ошибку?

3 ответа

Решение

Вы используете импорт

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

в вашем файле fxml.

Следовательно Button Экземпляр, созданный при загрузке файла FXML, является 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.");
}

Обратите внимание, что:

1) Вы использовали старый Swing библиотека в операторах импорта

2) Вам нужно добавить @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.");
    }
}

Также отметим, что как Fabian а также Michael сказал, что в их ответах вам не нужно ActionEvent actionEvent в методе clickAction. Итак, в конце концов:

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

Единственная проблема, которую я вижу, если ваш импорт ActionEvent. Вы используете awt и должны использовать javafx ActionEvent.

import javafx.event.ActionEvent

Редактировать 1

Вам также не нужно иметь ActionEvent в качестве параметра, если он вам не нужен, просто FYI.

Недавно, кажется, у меня была похожая проблема. FXML давал мне ошибку. Причина - неправильно импортированная библиотека. Вместоjava.scene.control, Я импортировал java.awt.

посмотрите на возможности:

ht tps:https://stackru.com/images/4fe74e5bbab6861a7f5f78194f75ba8dfc53410b.png

Другие вопросы по тегам