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