`

swing 国际化

阅读更多

查阅了很多资料,最简单的需求是当用户登录的时候选择语言,这个就不说了。

比较变态的需求是,当用户已经登录到某个界面的时候突然想到要修改语言了(的确够变态 哈哈), 查阅了很多资料,找到一个不错的方法。

该方法使用了观察着模式,就是给每一个面板添加监听,当用户修改语言的时候,触发所有已存在的面板的监听程序,将对应面板上的语言全部修改成新的语言版本。

简单步骤如下:
1,定义监听接口

/**
 * 
 */
package com.rodrigue.nepo.multilanguage;

/**
 * @author LEO.ZHOU
 * DATE Nov 29, 2009
 */
public interface LangChangeListener {
         public void updateResource();
}

 

2,写一个用于管理的类

/**
 * 
 */
package com.rodrigue.nepo.multilanguage;

import java.util.LinkedList;
import java.util.Locale;
import java.util.ResourceBundle;

/**
 * @author LEO.ZHOU
 * DATE Nov 29, 2009
 */
public class ResourceManager {
        
        private LinkedList<LangChangeListener> listeners = new LinkedList<LangChangeListener>();
        private ResourceBundle bundle;
        private Locale locale;
        private boolean changed = false;
        
        // ResourceBundle file
        private static final String RESOURCE_NAME = "nepo";

        // singleTon
        private static ResourceManager manager;

        public static ResourceManager getInstance() {
                if(manager == null) {
                        manager = new ResourceManager();
                }
                return manager;
        }

        public void changeLocal(Locale newLocal) {
                if(newLocal != null) {
                        locale = newLocal;
                        changed = true;
                }
        }
        
        // get value by key
        @SuppressWarnings("finally")
        public String getString(String key) {
                String value = "";
//                try {
                        value = getBundle().getString(key);
//                } catch (MissingResourceException e) {
//                        value = key;
//                        throw e;
//                } finally {
                        return value;  
//                }
        }
        
        /**
         * get bundle
         * 
         * @return
         */
        private ResourceBundle getBundle() {
                if (locale == null) {
                        locale = new Locale("en", "US");
                        changed = true;
                }
                if (bundle == null) {
                        bundle = ResourceBundle.getBundle(RESOURCE_NAME, locale);
                } else {
                        if(changed) {
                                bundle = ResourceBundle.getBundle(RESOURCE_NAME, locale);
                                changed = false;
                        }
                }
                return bundle;
        }
        
        public void addListener(LangChangeListener lsn) {
                listeners.add(lsn);
        } 
        
        //Invoke listener
        public void languageChangedEvent(Locale locale) {
                changeLocal(locale); 
                for(LangChangeListener listener : listeners) {
                        if(listener != null) {
                                listener.updateResource();
                        }
                }
        }
        

}

 

3,定义一个实现了语言监听接口的抽象类,该类继承jpanel类(以后所有的自定义 类都要继承该抽象类)

package com.rodrigue.nepo.multilanguage;

import java.awt.LayoutManager;

import javax.swing.JPanel;

public abstract class JPanelMultiLanguageNepo extends JPanel implements LangChangeListener{
        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        /**
     * Creates a new JPanel with the specified layout manager and buffering
     * strategy.
     *
     * @param layout  the LayoutManager to use
     * @param isDoubleBuffered  a boolean, true for double-buffering, which
     *        uses additional memory space to achieve fast, flicker-free 
     *        updates
     */
    public JPanelMultiLanguageNepo(LayoutManager layout, boolean isDoubleBuffered) {
        super(layout, isDoubleBuffered);
        customConstruct(layout, isDoubleBuffered);
        
    }

    /**
     * Create a new buffered JPanel with the specified layout manager
     *
     * @param layout  the LayoutManager to use
     */
    public JPanelMultiLanguageNepo(LayoutManager layout) {
            super(layout);
            customConstruct(layout);
    }

    /**
     * Creates a new <code>JPanel</code> with <code>FlowLayout</code>
     * and the specified buffering strategy.
     * If <code>isDoubleBuffered</code> is true, the <code>JPanel</code>
     * will use a double buffer.
     *
     * @param isDoubleBuffered  a boolean, true for double-buffering, which
     *        uses additional memory space to achieve fast, flicker-free 
     *        updates
     */
    public JPanelMultiLanguageNepo(boolean isDoubleBuffered) {
            super(isDoubleBuffered);
            customConstruct(isDoubleBuffered);
    }

    /**
     * Creates a new <code>JPanel</code> with a double buffer
     * and a flow layout.
     */
    public JPanelMultiLanguageNepo() {
            super();
            customConstruct();
    }
    
    public JPanelMultiLanguageNepo(Object... objs) {
            super();
            customConstruct(objs);
    }
    
    //-----------------------------------MULTI LANGUAGE-------------------START
    private void customConstruct(Object... objs) {
            ResourceManager.getInstance().addListener(this);
            iniCurrentComponents(objs);
            updateResource();
    }
    
    protected String getResource(String key) {
            return ResourceManager.getInstance().getString(key);
        }  
    
    public abstract void iniCurrentComponents(Object... objs);
    public abstract void updateResource();
    //-----------------------------------MULTI LANGUAGE-------------------END

}

 

4,每当你新建一个面板的时候都需要继承上面的抽象类

package com.rodrigue.nepo.ui.template.component;
/**
 * @author LEO.ZHOU
 * DATE Nov 20, 2009
 */
public class JPopupPanel extends JPanelMultiLanguageNepo {
        
        private String titleKey;
        private JLabel titleLabel;

        public JPopupPanel(String titleKey) {
                super(titleKey);
        }
        
        //这里用来定义组件
        @Override
        public void iniCurrentComponents(Object... objs) {
                this.titleKey = (String) objs[0];
                iniComponents();
                iniLayout();
                addActions();
        }
        
        //所有需要国际化的text,tooltip text等在这里设置
        @Override
        public void updateResource() {
                titleLabel.setText(getResource(titleKey));
                
        }
}

 

5,当用户修改某个语言的时候调用一下方法

ResourceManager.getInstance().languageChangedEvent(new Locale("zh", "CN"));
 
分享到:
评论

相关推荐

    Java 国际化操作

    Java 国际化(i18n)是Java平台提供的一种强大的功能,使得软件能够适应全球不同地区的语言和文化环境。这一过程涉及到日期、时间、货币格式、数字、字符串的本地化以及错误消息的定制。Java通过使用Resource Bundle...

    java swing可视化插件

    8. Swing Utilities:辅助类,提供各种有用的功能,如绘制、国际化和线程同步等。 使用 MyEclipse 的 Swing 可视化插件,开发者可以方便地进行以下操作: 1. 创建和编辑 GUI 布局:通过拖放组件和设置布局管理器来...

    Swing 组件大全

    8. **Swing国际化与本地化**: - Swing支持应用程序的国际化和本地化,可以方便地为不同语言的用户提供相应的界面。 综上所述,Swing组件大全教程将详细介绍这些组件的用法,提供实例代码,帮助开发者熟练掌握...

    精通Java Swing程序设计(中文CHM)

    7. **Swing国际化** - 使用ResourceBundle和BorderLayout,实现多语言支持。 8. **Swing线程机制** - AWT/Swing组件不是线程安全的,所有的GUI更新应在Event Dispatch Thread(EDT)中进行,以避免线程冲突。 ...

    javaswing学习教程

    九、Swing国际化 Swing 支持多语言环境,通过ResourceBundle和Locale类,开发者可以轻松地为应用程序添加多种语言的支持。 十、Swing最佳实践 在实际开发中,遵循一些最佳实践能提高Swing应用的质量和性能。比如,...

    JAVA图形化界面SWING

    此外,Swing 还支持国际化和无障碍访问,可以创建适应不同语言和特殊需求的界面。 总的来说,这个压缩包中的文件涵盖了Swing的基本用法,包括创建窗口、游戏开发、以及可能的网络应用界面设计。学习和理解这些代码...

    swing可视化开发插件.rar

    6. **国际化支持**:对于需要多语言支持的应用,插件通常提供对资源bundle的管理,帮助开发者实现GUI的本地化。 7. **版本控制**:与IDE集成的插件往往也支持版本控制系统,如Git,使得团队协作更为顺畅。 8. **...

    java swing漂亮界面 超酷 javaswing教程

    8. **国际化支持**:Swing 提供了对多语言的支持,通过ResourceBundle可以轻松实现应用的国际化。 9. **SwingWorker**:这是一个异步执行任务的类,用于在后台线程中执行耗时操作,防止阻塞用户界面。 10. **组件...

    swing_hack,swing_hack

    10. **国际化与本地化**: Swing支持应用程序的国际化和本地化,通过ResourceBundle和Locale对象,可以轻松地根据用户的语言和地区设置显示相应的文本和资源。 综上所述,Swing_hack可能涉及Swing组件的高级用法、...

    Swing插件下载,swing下载,java-swing下载,swing-plugin

    7. **国际化(Internationalization)**:Swing支持多语言,允许应用适应不同地区的用户。 8. **Swing小部件(Swing Utilities)**:提供了一些便利的工具方法,如SwingUtilities.invokeLater()用于确保在事件调度...

    swing开发的源代码

    9. **国际化(Internationalization)**:Swing支持多语言环境,通过ResourceBundle和Locale类,可以轻松实现应用程序的国际化。 10. ** Swing Look and Feel (L&F)**:Swing允许开发者更改应用的外观和感觉,通过...

    90个java-swing基础例子.zip

    9. **国际化(Internationalization)**:Swing支持国际化,可以轻松地为不同语言的用户提供界面。 10. **线程管理**:Swing不是线程安全的,所有对Swing组件的修改应在Event Dispatch Thread (EDT)中进行,以避免...

    swing经典开发,全面了解java swing核心编程

    Swing还支持事件处理、布局管理、国际化和可访问性,使得开发者可以构建功能强大的桌面应用程序。 在"精通swing程序设计.chm"这个文件中,我们可能找到以下关键知识点: 1. **组件(Components)**:Swing提供了一...

    java swing mysql实现的酒店管理系统项目源码_swing_JavaSwing_酒店管理系统_

    Java提供了ResourceBundle类和Locale对象来实现界面文本的国际化和本地化。 以上就是Java Swing MySQL实现的酒店管理系统项目所涉及的关键技术和知识领域。这个项目不仅可以帮助开发者提升Swing和数据库应用的开发...

    swing 日期选择控件

    这些资源对于正确显示和操作日期选择器至关重要,它们可能涉及到控件的外观设计、日期格式、国际化支持等方面。 `datepicker资源库`很可能是指包含DatePicker控件的所有相关文件的文件夹,可能包含以下内容: 1. `...

    swing 文本编辑器

    5. **i18n**: 这个目录通常包含国际化的资源文件,如 locale 目录,用于支持不同的语言和文化环境。在 Swing 应用中,这些资源文件可以用来实现文本编辑器的多语言支持。 6. **src**: 这是源代码目录,其中包含了 ...

    JAVA swing中文离线API文档

    这份文档不仅包含了组件的用法,还有异常处理、国际化支持以及无障碍功能等相关信息,对于理解和使用Swing进行桌面应用开发至关重要。 总之,"JAVA Swing中文离线API文档"是一个极其宝贵的资源,它可以帮助Java开发...

    最全面的swing文本编辑器

    Swing 支持国际化和本地化,使应用能够适应不同语言环境。开发者可能使用了 `ResourceBundle` 和 `PropertyResourceBundle` 来管理翻译文本。 通过研究 "NewEditor" 文件,我们可以深入理解如何在Swing中实现一个...

    java swing电子教程

    Swing支持国际化和本地化,这使得开发者能够轻松地为不同地区的用户提供适应的语言环境。通过ResourceBundle类,可以加载不同语言的资源文件,实现多语言切换。 此外,Swing还引入了JOptionPane,它提供了一些预...

Global site tag (gtag.js) - Google Analytics