FXMLLoader.constructLoadException [дубликат]

Единственное реальное преимущество параллельных массивов в Java - это (экстремальная) IMO, чтобы уменьшить распределение объектов и / или использование кучи. Для достаточно большой коллекции объектов 3 массива занимают меньше места И используют меньше объектов, чем один массив экземпляров какого-либо настраиваемого класса.

Этот подход обычно является плохим, поскольку он делает ваш код много более хрупким. Создание и использование пользовательского класса - лучший подход в большинстве ситуаций.

Примечание: Рекомендации по производительности для Android советуют иначе, но эти советы в основном направлены на снижение частоты / воздействия GC приостанавливает работу пользователя. И даже этот совет замаскирован несколькими способами.

3
задан Buddhika Jayawardhana 4 March 2015 в 03:34
поделиться

2 ответа

Проблема описана в трассировке стека:

Caused by: java.lang.NoSuchMethodException: com.buddhikajay.controller.NewTransactionDialogController.()

, которая в основном говорит, что ваш класс контроллера не имеет конструктора с нулевым аргументом.

По умолчанию FXMLLoader создаст контроллер, вызвав его конструктор с нулевым аргументом. Удалите конструктор, который вы определили в классе контроллера, или удалите требуемые параметры.

Если вам действительно нужно передать аргументы конструктору контроллера, вы можете либо создать контроллер в Java-коде, либо передать его в FXMLLoader:

NewTransactionDialogController controller = new NewTransactionDialogController(someValue);
FXMLLoader loader = new FXMLLoader();
loader.setLocation(...);
loader.setController(controller);
AnchorPane anchorPane = loader.load();

(используя этот код, вы должны удалить атрибут fx:controller из FXML.)

Или установить фабрику контроллера:

FXMLLoader loader = new FXMLLoader();
loader.setLocation(...);
loader.setControllerFactory(clazz -> {
    if (clazz == NewTransactionDialogController.class) {
        return new NewTransactionDialogController(someValue);
    } else {
        // default behavior:
        try {
            return clazz.newInstance();
        } catch (Exception exc) {
            throw new RuntimeException(exc);
        }
    }
});

AnchorPane anchorPane = loader.load();

(в этой версии оставить атрибут fx:controller в файле FXML.)

5
ответ дан James_D 15 August 2018 в 16:10
поделиться
  • 1
    Большое спасибо @JAmes_D. Я создал контроллер в главном приложении и передал его на FXMLLoader, и он работает. – Buddhika Jayawardhana 4 March 2015 в 04:01
  • 2
    Я думаю, что в контроллере fx: есть только опечатка? Точка before () выглядит подозрительной! – tomsontom 4 March 2015 в 06:16
  • 3
    К сожалению, это не причина ONLY . У меня был пустой конструктор, и FXML очень хорошо благодарит вас. Но , когда я добавил обработчик ActionEvent для кнопки, меня встретили аналогичное сообщение, подобное этому: & quot; avafx fxml LoadException: Error resolving onAction='#handleButtonAction', either the event handler is not in the Namespace or there is an error in the script. **unknown path** & quot; – will 7 July 2016 в 14:05
  • 4
    (... продолжение) ... Я думал, что вопрос path был рассмотрен как путь к классу, но контроллер работает, когда нет «# handleButtonAction» & quot; указано. СТРАННЫЙ? Да, это потому, что я вставил в код для образца «кликнуть меня». , удалили пустые конструкторы, и я ТОЛЬКО (все еще) получаю сообщение об ошибке при указании действия. – will 7 July 2016 в 14:06
  • 5
    Это трудно вставить в код, когда нет кода контроллера для вставки ... Если у вас есть вопрос, отличный от вопроса OP, вы должны отправить его ... – James_D 7 July 2016 в 17:01

Я собирался ввести другой вопрос, как заметил @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>
0
ответ дан will 15 August 2018 в 16:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: