我敢肯定有很多方法,但是什么是对您的代码影响最小的推荐方法呢?
显而易见的是,您创建了属性文件,但是如何在渲染中交换值?在J2EE中,您总是只重新渲染整个页面,因此很容易。但是在Swing应用程序中,您是否只是在paintComponent(Graphics g)方法中添加了.getProperty()的代码?
如果是这样的话,它看起来并不繁重,因为现在您必须在不需要的地方到处都覆盖此方法...
附加:您如何设置通知系统以重新呈现所有当前可见的组件,而无需强制某种注册模式?
我想如果我覆盖paintComponent(Graphics g),我要做的就是触发一个事件,该事件发生了某些变化,并且paintComponent(Graphics g)方法将被调用...
最佳答案
据我所知,某些应用程序使用布局/组件构建器(由Karsten Lentzsch建议,并且是JGoodies API的一部分)。这些构建器包括用于本地化组件的代码(在后台使用ResourceBundle
)。
其他人(包括我在内)更喜欢资源注入(inject);这通常是最少侵入的方法。这是Swing Application Framework(JSR-296)和其他GUI框架(例如Guts-GUI)选择的方式。
您可能还想看看this question,它与您的非常相似。
关于“实时”更改语言(Locale
更改通知),我认为使用资源注入(inject)时更容易实现(我已经在Guts-GUI中实现了这一点,Swing Application Framework可能也有,但是我不确定它)。
Java没有提供方法来监听Locale
的更改,因此您必须创建自己的“区域设置服务”(任何区域设置更改请求都应针对此服务)。在此服务中,您将必须枚举所有可见窗口(使用Window.getWindows()
可以实现,无需先注册可见组件),然后再次注入(inject)资源。
如果您想举个例子,请看看Guts-GUI source code中的resource
包:
Locale
的方法,该方法发送有关此更改的通知事件(为此使用事件总线,但也可以使用简单的监听器也可以)更新所有可见窗口的有趣代码复制如下:
for (Window window: Window.getWindows())
{
if (window.isVisible())
{
injectResources(window);
window.repaint();
if (window instanceof RootPaneContainer)
{
((RootPaneContainer) window).getRootPane().revalidate();
}
}
}