Ваш метод init()
полностью избыточен и должен быть удален. Правильный класс контроллера должен выглядеть следующим образом:
@Component
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class DemoController implements Initializable
{
@FXML
private TextField platformName;
@FXML
private TextField platformVersion;
@FXML
private TextField deviceName;
@FXML
private TextField appActivity;
@FXML
private TextField appPackage;
@Autowired
private DemoConfig demoConfig;
@Override
public void initialize(URL url, ResourceBundle resourceBundle)
{
platformName.setText(demoConfig.getPlatformName());
platformVersion.setText(demoConfig.getPlatformVersion());
deviceName.setText(demoConfig.getDeviceName());
appActivity.setText(demoConfig.getAppActivity());
appPackage.setText(demoConfig.getAppPackage());
}
}
Причина этого объясняется @ slaw в комментарии к вопросу. Для полноты я повторю эту информацию здесь:
При условии, что все настроено правильно в коде, который вы не опубликовали , когда вы вызываете load()
на вашем FXMLLoader
, произойдет следующее:
-
FXMLLoader
прочитает файл F XML и, увидев атрибут fx:controller
, получит экземпляр указанного класса, используя его фабрику контроллеров. Поскольку вы предположительно сконфигурировали фабрику контроллера для использования контекста приложения Spring для предоставления контроллера, он будет запрашивать компонент DemoController
из контекста приложения. - Контекст приложения Spring будет создавать экземпляр
DemoController
. - Контекст приложения Spring вводит любые зависимости в экземпляр
DemoController
. В этом случае это означает, что будет введено поле demoConfig
. - Контекст приложения Spring будет вызывать любые
@PostConstruct
-аннотированные методы. В исходной версии это означает, что он вызовет метод init()
, который создает экземпляры текстовых полей и устанавливает для их текста значения из demoConfig
. Поскольку эти текстовые поля не определены в файле F XML, они не являются частью пользовательского интерфейса , и это не имеет видимого эффекта. В правильной версии выше нет методов, помеченных @PostConstruct
, и этот шаг ничего не делает. FXMLLoader
продолжает анализ файла F XML, создавая экземпляры текстовых полей, определенных в нем. Если их fx:id
атрибуты соответствуют именам либо public
полей, либо (лучше) @FXML
-аннотированных неопубликованных c полей, эти поля будут инициализированы текстовыми полями, определенными как часть синтаксического анализа F XML файл. (Это текстовые поля, которые являются частью пользовательского интерфейса.) Таким образом, в исходной версии текстовые поля, инициализированные в методе init()
, немедленно заменяются текстовыми полями, определенными в файле F XML (поэтому вся работа, выполненная в методе init()
, немедленно теряется). - Метод
initialize()
вызывается на контроллере. Определение этого метода как в вашей версии, так и в версии, которую я выложил выше, теперь устанавливает текст правильных текстовых полей (т. Е. Тех, которые определены в файле F XML и являются частью пользовательского интерфейса). до значений в demoConfig
.
Как видите, все, что вы делаете в своем методе init()
, является избыточным (поскольку задает текст текстовых полей, которые никогда не отображаются в пользовательском интерфейсе), и в любом случае немедленно отменяется (поскольку FXMLLoader
немедленно заменяет текстовые поля, которые он определяет, новыми текстовыми полями.)
Следовательно, вы должны просто удалить метод init()
, как показано выше. Если это не дает желаемого результата, в коде, который вы не опубликовали, есть другие ошибки.
Обратите внимание, что я также изменил область действия контроллера на prototype
. Если бы вы загружали файл F XML более одного раза, вы каждый раз получали бы новый набор текстовых полей, и вам понадобился бы новый экземпляр контроллера специально для этого набора элементов управления. При использовании Spring с JavaFX все контроллеры всегда должны быть прототипами.