Доступ к локализации ResourceBundle внутри контроллера JavaFX FXML

Я пытаюсь добавить функции локализации в программу 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 поддерживает исключения для обработки ошибок.


52
1

Ответ:

Решено

Метод 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");
    }
    // ...
}