Я собирался ввести другой вопрос, как заметил @James_D для моего комментария, потому что до тех пор, пока я не прочитал первую строку FXML по этому вопросу, я думал , что у меня другая проблема.
Для моих грехов я уменьшил задачу до простого примера одного контроллера и двух файлов FXML. Один работал, а второй сбой / не удалось.
Отправной точкой является образец Netbeans «[Click me!]». Код будет вставлен ниже. И, наконец, решение.
В качестве преамбулы позвольте мне сказать, что, кажется, все обвиняют Java-контроллер в этих ошибках загрузки. Несколько лет назад у меня было множество ошибок, подобных этому в проекте. Мы исчерпали « контроллер » отладки и, в конечном счете, нажали вперед, перестроив экраны FXML с помощью ScendBuilder. Тогда у меня не было времени расследовать.
На прошлой неделе я отлично работал на FXML-экране, который не загружался, потому что мы перенесли его в каталог времени выполнения (ранее он был в области ресурсов JAR).
KLUNK!
После того, как 3 или 4 дня изменили это, я сделал здесь комментарий о моей ошибке:
unknown path: 7
Javafx fxml LoadException: Error resolving onAction='#handleButtonAction', either the event handler is not in the Namespace or there is an error in the script.
Только в файле simple .fxml ", но не в файле Scene .fxml". Файл «simple.fxml» сокращен из файла приложения FXML, который изначально дал проблему. В этом оригинальном файле было слишком много переменных, поэтому chop-chop-chop соответствует законсервированной демонстрации.
Когда вы используете ТОЛЬКО это:
xmlns:fx="http://javafx.com/fxml"
Загрузка FXML с файлы на диске, находящиеся в папке вашего приложения, работают так же, как вы хотите, чтобы они (ну, как и я хочу, в любом случае). Глядя на FXML выше, он использует более ' хрупкое ' пространство имен, а именно
исходный FXML Queston:
<AnchorPane ...
xmlns="http://javafx.com/javafx/8"
xmlns:fx="http://javafx.com/fxml/1" ... >
Используя diff, I медленно morphed «simple.fxml» как можно ближе к «Scene.fxml», а «простой» просто не загружается. Пожалуйста, обратите внимание; всегда используя один и тот же контроллер
Загрузка FXML с другими метаданными не работала последовательно, и файл FXML был перемещен. У меня нет объяснений относительно , как это .
Например, FXML хранится в каталоге, называемом «test / resources / fxml / simple.fxml». Когда я строил оба файла в JAR проекта, « тот же » FXML в обоих загруженных случаях и работал , как и ожидалось. Для меня есть что-то не сказанное об аспектах недогрузки файла. Опять же для меня это нежелательно, потому что значение ключа KEY для определения внешней сцены будет обмениваться.
Эти виды медвежьих ловушек в разметке XML, которые (по-видимому) не подхвачены инструментами разработки, такими как SceneBuilder или FXMLLoader () являются препятствиями для прогресса в живых проектах, которые не имеют возможности исследовать эзотерическую странность , как это.
Это подтверждается нашим предыдущим опытом проекта - I было легче переделать сложный экран с SceneBuilder в целом, чем отслеживать проблемы с загрузкой, подобные этой. Призыв к действию: Диагностика на загрузке FXML - это почти требование к FXML Lint.
Controller, SimpleController.java:
package ex.view.views;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
public class SimpleController implements Initializable {
@FXML
private Label label;
@FXML
private void handleButtonAction(ActionEvent event) {
System.out.println("You clicked me!");
label.setText("Hello World!");
}
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}
Неудачный FXML начал жизнь как один из архетипов Maven (, я думаю, ), и этот файл работал нормально, пока я не переместил файлы FXML в папку и не загрузил их из InputStream
.
Я отформатировал разметку AnchorPane на нескольких строках для удобства чтения.
simple.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320"
xmlns="http://javafx.com/javafx/8.0.65"
xmlns:fx="http://javafx.com/fxml/1"
fx:controller="ex.view.views.SimpleController">
<children>
<Button fx:id="button" layoutX="126" layoutY="90" text="Click Me!" />
<Label fx:id="label" layoutX="126" layoutY="120" minHeight="16" minWidth="69" />
</children>
</AnchorPane>
Рабочая разметка FXML производится из выборок Netbeans 8.1.
Scene.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320"
xmlns:fx="http://javafx.com/fxml"
fx:controller="ex.view.views.SimpleController">
<children>
<Button layoutX="126" layoutY="90" text="Click Me!" onAction="#handleButtonAction" fx:id="button" />
<Label layoutX="126" layoutY="120" minHeight="16" minWidth="69" fx:id="label" />
</children>
</AnchorPane>