Похоже, вы пытаетесь ввести TextField
в статическое поле. Что-то вроде
@FXML
private static TextField myTextField ;
Это, по-видимому, работало в JavaFX 2.2. Он не работает в JavaFX 8. Поскольку ни одна официальная документация никогда не поддерживала это использование, это на самом деле не нарушает обратную совместимость, хотя, с полным основанием, документация о том, что делает FXMLLoader
, довольно горькая.
На самом деле не имеет смысла делать статические поля @FXML
-injected. Когда вы загружаете файл FXML, он создает новые объекты для каждого из элементов в файле FXML. Новый экземпляр контроллера связан с каждым вызовом FXMLLoader.load(...)
, а поля в экземпляре этого контроллера вводятся соответствующими объектами, созданными для элементов FXML. Таким образом, введенные поля обязательно специфичны для экземпляра контроллера. Если у вас были статические введенные поля в контроллере, и вы дважды загрузили один и тот же файл FXML и дважды отображали его в пользовательском интерфейсе, тогда у вас не было бы способа ссылаться на оба набора элементов управления.
Обновление: ответ на вопрос в комментариях
В частности, не используйте статические поля, чтобы они могли быть доступны извне класса. Статическое поле имеет одно значение, принадлежащее классу, вместо значения для каждого экземпляра класса, и решение о создании полей static должно выполняться только в том случае, если это имеет смысл. Другими словами, static
определяет область scope , а не доступность . Чтобы разрешить доступ к данным экземпляра, вам просто нужно иметь ссылку на экземпляр. FXMLLoader
имеет метод getController()
, который позволяет вам получить ссылку на контроллер.
Связанная точка: также не рекомендуется отображать элементы управления пользовательского интерфейса от контроллера. Вместо этого вы должны предоставить данные. Например, вместо определения метода getTextField()
в контроллере вместо этого определите метод textProperty()
, который возвращает StringProperty
, представляющий содержимое TextField
. Причина этого в том, что, когда ваш босс приходит в офис и говорит вам, что он хочет заменить TextField
на TextArea
или ComboBox
или на какой-то другой элемент управления, тогда это будет намного сложнее если классы вне контроллера используют ваш TextField
. Структура данных, представленных вашим контроллером, гораздо реже изменяется, чем реализация того, как эти данные представляются пользователю.
Для некоторых примеров
Вы объявляете 15 столбцов данных в инициализации DataTables, но в заголовке таблицы в HTML есть только 14 столбцов. Вот почему удаление Rev исправляет это, потому что это делает числа совпадающими. Просто добавьте еще один столбец в заголовок, и все будет хорошо.