Ваш WindowTwoController#show()
метод является методом экземпляра. Это означает, что вам нужно создать экземпляр WindowTwoController
для вызова show()
. Однако при использовании fx:controller
в файле FXML FXMLLoader
создаст свой собственный экземпляр класса контроллера. Конечным результатом является то, что TextField
, к которому вы добавляете слушателя, не совпадает с FXMLLoader
, созданным, введенным и добавленным в граф сцены.
Примечание: Вы никогда не хотите создавать экземпляры полей, которые будут внедрены FXMLLoader
(то есть полей с соответствующими атрибутами fx:id
). В лучшем случае это пустая трата ресурсов, а в худшем - незначительные ошибки. Если удаление логики создания экземпляра приводит к NullPointerException
, значит, что-то не так с вашей настройкой.
Один из способов решения вашей проблемы - не использовать fx:controller
, а вместо этого установить контроллер вручную:
@FXML private TextField imieTF; // don't instantiate manually
public void show() {
FXMLLoader loader = new FXMLLoader(/* location */);
loader.setController(this); // must set before calling load()
Parent root = loader.load();
// remaining code omitted
}
Другой другой вариант (и в этом случае я лично предпочитаю вышеизложенное) состоит в том, чтобы следовать Гербену Джонгериусу : сделать show()
статическим методом и переместить add-listener-to- TextField
логика в методе initialize()
. Если вы не знаете, метод initialize()
вызывается после того, как все соответствующие поля были введены.
Просто чтобы показать другой способ ведения дел:
Обратите внимание, что вам не нужно добавлять ChangeListener
в коде; Вы также можете зарегистрировать прослушиватель свойств в файле FXML. Это задокументировано Введение в FXML .
FXML:
<TextField onTextChange="#handleTextChange"/>
Метод контроллера:
@FXML
private void handleTextChange(ObservableValue<? extends String> observable,
String oldValue, String newValue) {
// do something...
}