Насколько я знаю, некоторые приложения используют компоновщик / компонент builders (по совету Карстена Ленцша и части JGoodies API).Эти компоновщики включают код для локализации компонентов (используя ResourceBundle
под капотом).
Другие люди (включая меня) предпочитают внедрение ресурсов ;обычно это наименее навязчивый метод.Это путь, выбранный Swing Application Framework (JSR-296) и другими структурами GUI, такими как Guts-GUI .
Вы также можете посмотретьна этот вопрос , который очень похож на ваш.
Что касается изменений языка "на лету" (Locale
уведомление об изменении), я думаю, что это легче реализовать при использовании внедрения ресурсов(Я уже реализовал это в Guts-GUI, Swing Application Framework может также иметь его, но я не уверен в этом).
Java не предлагает способа прослушать изменения Locale
, поэтому вам нужно создатьу вас есть «служба локали» (к которой должен быть адресован любой запрос на смену локали).В этом сервисе вам нужно будет перечислить все видимые окна (это возможно с Window.getWindows()
, нет необходимости регистрировать видимые компоненты раньше), а затем снова внедрить ресурсы.
Если вам нужен пример, посмотритев пакете resource
в исходный код GUTS-GUI :
- ResourceInjector показывает внедрение ресурсов и метод для изменения
Locale
, который отправляет уведомлениесобытие (для этого используется шина событий , но простые слушатели тоже подойдут) об этом изменении - WindowController прослушивает события изменения локали
Интересный код для обновления всех видимых окон скопирован ниже:
for (Window window: Window.getWindows())
{
if (window.isVisible())
{
injectResources(window);
window.repaint();
if (window instanceof RootPaneContainer)
{
((RootPaneContainer) window).getRootPane().revalidate();
}
}
}