我敢肯定有很多方法,但是什么是对您的代码影响最小的推荐方法呢?

显而易见的是,您创建了属性文件,但是如何在渲染中交换值?在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包:

  • ResourceInjector显示了资源注入(inject)和更改Locale的方法,该方法发送有关此更改的通知事件(为此使用事件总线,但也可以使用简单的监听器也可以)
  • WindowController收听区域设置更改事件

  • 更新所有可见窗口的有趣代码复制如下:
    for (Window window: Window.getWindows())
    {
        if (window.isVisible())
        {
            injectResources(window);
            window.repaint();
            if (window instanceof RootPaneContainer)
            {
                ((RootPaneContainer) window).getRootPane().revalidate();
            }
        }
    }
    

    10-07 19:18
    查看更多