@FXML не инициализирует VBox [дубликат]

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

13
задан jewelsea 24 April 2014 в 09:12
поделиться

1 ответ

Похоже, вы пытаетесь ввести 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<String> или на какой-то другой элемент управления, тогда это будет намного сложнее если классы вне контроллера используют ваш TextField. Структура данных, представленных вашим контроллером, гораздо реже изменяется, чем реализация того, как эти данные представляются пользователю.

Для некоторых примеров

31
ответ дан James_D 18 August 2018 в 11:04
поделиться
  • 1
    Спасибо, Джеймс. Есть ли в любом случае доступ к содержимому компонента из других классов контроллера? Например, у меня есть некоторый контент (флажки и таблицы), отображаемые в спискеView в одном классе контроллера. Если я хочу получить доступ к нему из другого класса контроллера без изменения или изменения его содержимого, как мне это сделать? – Christopher_Daniel 17 April 2014 в 11:38
  • 2
    +1 за хорошее объяснение. В этих ситуациях я всегда думал, что статичность имеет смысл. Вы все равно можете использовать статику еще 8b109 . Речь идет о 5-м вопросе, который я видел на этом до сих пор, но никогда не объяснял «почему не статичный». – brian 17 April 2014 в 15:31
Другие вопросы по тегам:

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