Я пытаюсь добавить функции локализации в программу JavaFX с помощью FXML. Насколько я понимаю, когда вы создаете объект FXMLLoader
, вы можете передать ResourceBundle
в конструктор FXMLLoader
вот так:
FXMLLoader loader = new FXMLLoader(Application.class.getResource("main-menu.fxml"),
ResourceBundle.getBundle("com.example.myApp.MainMenu");
Однако я хочу иметь доступ к ResourceBundle
внутри одного из моих контроллеров, чтобы я мог сделать что-то вроде этого:
class MainMenuController {
// ...
@FXML
protected void onButtonClick() {
welcomeText.setText(localisationBundle.getString("greetMessage");
}
// ...
}
Я поместил следующий метод инициализации в свой контроллер главного меню...
@FXML
public void initialize(URL location, ResourceBundle bundle) {
this.localisationBundle = bundle;
}
... но он не вызывается при запуске программы, и поэтому localisationBundle
имеет значение null, когда моя кнопка нажата. Метод инициализации вызывается только тогда, когда я изменяю его подпись, чтобы она не имела параметров.
Я видел в StackOverflow предложение о том, что мой контроллер должен реализовать Initializable, однако в документации говорится, что это было заменено.
Мой вопрос: есть ли способ получить доступ к ResourceBundle
, который передается конструктору FXMLLoader
? Initializable
Это единственный способ, которым я могу это сделать, или есть лучший способ?
Заранее спасибо :)
🤔 А знаете ли вы, что...
Java поддерживает исключения для обработки ошибок.
Метод initialize()
, принимающий параметры URL
и ResourceBundle
, вызывается, только если вы реализуете Initializable
. Этот интерфейс не устарел, поэтому я думаю, что можно использовать этот подход; однако он был заменен (цитируя документацию
автоматическое введение свойств
location
иresources
в контроллер.
Для этого вам нужно:
public class MainMenuController {
@FXML
private ResourceBundle resources ;
// if needed:
@FXML
private URL location ;
// ...
@FXML
protected void onButtonClick() {
welcomeText.setText(resources.getString("greetMessage");
}
// ...
}