`

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 国际化操作Java 国际化操作Java 国际化操作Java 国际化操作Java 国际化操作Java 国际化操作Java 国际化操作

    java_diary_18.rar_JFC_swing_反射机制_国际化 java

    j2se 18天笔记是根据网络上资料而制作成的CHM帮助文档 目录: Day01:java环境与数据类型 Day02:数据运算与数组 Day03:面向对象 ...Day16:国际化与新特性 Day17:新特性与并发线程 Day18:软件开发流程

    Java+AW+Swing.rar_java 2 swing_java awt_java swing_swing_swing j

    Java 2 图形设计卷1 AWT Java 2 图形设计卷2 SWING 主要内容包括同位体、轻量构件、剪贴板与数据传输、颜色、无鼠标操作、打印、布局管理器、国际化、串行化、滚动性,字体与字号以及AWT,swing中的各种构件

    swing写的一个ftp客户端

    1、客户端的文件浏览、目录切换、新建文件、文件删除 2、服务端的文件浏览、目录切换...11、国际化支持 12、下载线程的暂停、重新开始、取消 13、下载记忆功能,重启程序显示上次未下载完成的记录,双击即可继续下载

    基于Spring+hibernate+mysql+rmi+swing的登录Demo

    应用Spring+hibernate+mysql+rmi+swing 做一个远程用户登陆界面。登陆进去以后出现一个界面,可以增加和删除用户。并实现国际化,压缩包中有mysql的数据库脚本。

    java(awt/swing)局域网即时聊天源码

    运用面向对象编程,继承、封装和多态等,Java语言的基本语法,Java IO;多线程编程,网络编程,序列化,反射,程序国际化;基本的界面编程(AWT和Swing)等基础知识。是学习java基础的一个极好案例。

    深入学习:jfc swing—java 基础类组件集.rar

    国际上,在选择编程语言时,无论是编程者还是决策者都会首选Java,因为其程序可商品化,可以被更多人、更多系统所用。目前,介绍Java编程的书很多,但深层次的书较少,而编程者,特别是有经验的编程者恰恰希望阅读或...

    深入学习:JFC Swing——Java基础类组件集

    国际上,在选择编程语言时,无论是编程者还是决策者都会首选Java,因为其程序可商品化,可以被更多人、更多系统所用。目前,介绍Java编程的书很多,但深层次的书较少,而编程者,特别是有经验的编程者恰恰希望阅读或...

    JChess:一个简单的 Java 国际象棋游戏

    它使用 Java 的 Swing 库作为可视化组件,可能违反了大多数代码质量指南和 OOP 原则,因为我最近才开始学习这些。 从好的方面来说,我认为评论很好地解释了正在发生的事情。 从我的测试来看,它应该能够正确地执行...

    WeSync:用Java Swing写的数据库同步软件

    WeSync ... JavaSwing一些图标 ...config.xml:UI设置参数的持久化重新初始化.sql:还原相关表到初始化状态的memo zh-cn.properties:语言,国际化 DB_Backup:备份相关 mysql_backup.bat:备份脚本mysql_

    SWIRL Swing enhancements library-开源

    Swirl库提供了几个Java类,这些类通过国际化的操作和按钮,特殊的“单元格”列表,鼠标覆盖面板,表列装饰,日志记录窗口,简单的对话框面板等来增强Java Swing。

    Winzip Java版.rar_Java_Win.r_Java_Win.rar_winzip_zip_参数工具 java

    本项目推出的目的是丰富java工具集,另外就是提供给java研究组织的会员一个锻炼的机会。 希望有兴趣提高自己的java应用程序编程的java研究组织的朋友加入我们的开发行列。 我们希望在给大家提供一个实用的工具...国际化

    Java SE实践教程 源代码 下载

    第10章 准备环球旅行——应用程序国际化 243 10.1 讲解 244 10.1.1 概念介绍 244 10.1.2 设置Locale 249 10.1.3 隔离语言环境相关数据 252 10.1.4 格式化 258 10.2 练习 266 10.2.1 对单独的文件进行国际化 ...

    java核心技术卷2 高级特性

    Java技术权威指南,全面覆盖Java技术的高级主题,包括流与文件、XML、网络、数据库编程、高级Swing、高级 AWT、JavaBean构件、安全、分布式对象、脚本、编译与注解处理等,同时涉及本地化、国际化以及Java SE 6的...

    Java核心技术 卷Ⅱ 高级特性(第8版)

    第5章 讨论了一个我们认为重要性将不断提升的特性——国际化 第6章 涵盖了没有纳入卷1的所有Swing知识 第7章 介绍Java 2D API 第8章 介绍了用于Java平台的构件API——JavaBean 第9章 继续介绍Java安全模式 第10章 ...

    java图书馆swing源码-chess-java:为Penn的CIS120课程构建的简单JavaChess游戏

    java图书馆swing源码国际象棋 Java 2014 年Spring,我在宾夕法尼亚大学的编程课程中创建了一个两人国际象棋游戏,其中包含将死检测和国际象棋时钟。 我们的目标是用 Java 开发和测试无错误的独立游戏,并配有 GUI 和...

    Java核心技术(原书第8版)卷Ⅱ 高级特性

    本书是Java技术权威指南,全面覆盖Java技术的高级主题,包括流与文件、XML、网络、数据库编程、高级Swing、高级 AWT、JavaBean构件、安全、分布式对象、脚本、编译与注解处理等,同时涉及本地化、国际化以及Java SE ...

    Java SE实践教程 pdf格式电子书 下载(一) 更新

    第10章 准备环球旅行——应用程序国际化 243 10.1 讲解 244 10.1.1 概念介绍 244 10.1.2 设置Locale 249 10.1.3 隔离语言环境相关数据 252 10.1.4 格式化 258 10.2 练习 266 10.2.1 对单独的文件进行国际化 ...

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    第10章 准备环球旅行——应用程序国际化 243 10.1 讲解 244 10.1.1 概念介绍 244 10.1.2 设置Locale 249 10.1.3 隔离语言环境相关数据 252 10.1.4 格式化 258 10.2 练习 266 10.2.1 对单独的文件进行国际化 ...

    Java核心技术(卷2):高级特性.pdf

    高级特征》是Java技术权威指南,全面覆盖Java技术的高级主题,包括流与文件、XML、网络、数据库编程、高级Swing、高级 AWT、JavaBean构件、安全、分布式对象、脚本、编译与注解处理等,同时涉及本地化、国际化以及...

Global site tag (gtag.js) - Google Analytics