查阅了很多资料,最简单的需求是当用户登录的时候选择语言,这个就不说了。
比较变态的需求是,当用户已经登录到某个界面的时候突然想到要修改语言了(的确够变态 哈哈), 查阅了很多资料,找到一个不错的方法。
该方法使用了观察着模式,就是给每一个面板添加监听,当用户修改语言的时候,触发所有已存在的面板的监听程序,将对应面板上的语言全部修改成新的语言版本。
简单步骤如下:
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 国际化(i18n)是Java平台提供的一种强大的功能,使得软件能够适应全球不同地区的语言和文化环境。这一过程涉及到日期、时间、货币格式、数字、字符串的本地化以及错误消息的定制。Java通过使用Resource Bundle...
8. Swing Utilities:辅助类,提供各种有用的功能,如绘制、国际化和线程同步等。 使用 MyEclipse 的 Swing 可视化插件,开发者可以方便地进行以下操作: 1. 创建和编辑 GUI 布局:通过拖放组件和设置布局管理器来...
8. **Swing国际化与本地化**: - Swing支持应用程序的国际化和本地化,可以方便地为不同语言的用户提供相应的界面。 综上所述,Swing组件大全教程将详细介绍这些组件的用法,提供实例代码,帮助开发者熟练掌握...
7. **Swing国际化** - 使用ResourceBundle和BorderLayout,实现多语言支持。 8. **Swing线程机制** - AWT/Swing组件不是线程安全的,所有的GUI更新应在Event Dispatch Thread(EDT)中进行,以避免线程冲突。 ...
九、Swing国际化 Swing 支持多语言环境,通过ResourceBundle和Locale类,开发者可以轻松地为应用程序添加多种语言的支持。 十、Swing最佳实践 在实际开发中,遵循一些最佳实践能提高Swing应用的质量和性能。比如,...
此外,Swing 还支持国际化和无障碍访问,可以创建适应不同语言和特殊需求的界面。 总的来说,这个压缩包中的文件涵盖了Swing的基本用法,包括创建窗口、游戏开发、以及可能的网络应用界面设计。学习和理解这些代码...
6. **国际化支持**:对于需要多语言支持的应用,插件通常提供对资源bundle的管理,帮助开发者实现GUI的本地化。 7. **版本控制**:与IDE集成的插件往往也支持版本控制系统,如Git,使得团队协作更为顺畅。 8. **...
8. **国际化支持**:Swing 提供了对多语言的支持,通过ResourceBundle可以轻松实现应用的国际化。 9. **SwingWorker**:这是一个异步执行任务的类,用于在后台线程中执行耗时操作,防止阻塞用户界面。 10. **组件...
10. **国际化与本地化**: Swing支持应用程序的国际化和本地化,通过ResourceBundle和Locale对象,可以轻松地根据用户的语言和地区设置显示相应的文本和资源。 综上所述,Swing_hack可能涉及Swing组件的高级用法、...
7. **国际化(Internationalization)**:Swing支持多语言,允许应用适应不同地区的用户。 8. **Swing小部件(Swing Utilities)**:提供了一些便利的工具方法,如SwingUtilities.invokeLater()用于确保在事件调度...
9. **国际化(Internationalization)**:Swing支持多语言环境,通过ResourceBundle和Locale类,可以轻松实现应用程序的国际化。 10. ** Swing Look and Feel (L&F)**:Swing允许开发者更改应用的外观和感觉,通过...
9. **国际化(Internationalization)**:Swing支持国际化,可以轻松地为不同语言的用户提供界面。 10. **线程管理**:Swing不是线程安全的,所有对Swing组件的修改应在Event Dispatch Thread (EDT)中进行,以避免...
Swing还支持事件处理、布局管理、国际化和可访问性,使得开发者可以构建功能强大的桌面应用程序。 在"精通swing程序设计.chm"这个文件中,我们可能找到以下关键知识点: 1. **组件(Components)**:Swing提供了一...
Java提供了ResourceBundle类和Locale对象来实现界面文本的国际化和本地化。 以上就是Java Swing MySQL实现的酒店管理系统项目所涉及的关键技术和知识领域。这个项目不仅可以帮助开发者提升Swing和数据库应用的开发...
这些资源对于正确显示和操作日期选择器至关重要,它们可能涉及到控件的外观设计、日期格式、国际化支持等方面。 `datepicker资源库`很可能是指包含DatePicker控件的所有相关文件的文件夹,可能包含以下内容: 1. `...
5. **i18n**: 这个目录通常包含国际化的资源文件,如 locale 目录,用于支持不同的语言和文化环境。在 Swing 应用中,这些资源文件可以用来实现文本编辑器的多语言支持。 6. **src**: 这是源代码目录,其中包含了 ...
这份文档不仅包含了组件的用法,还有异常处理、国际化支持以及无障碍功能等相关信息,对于理解和使用Swing进行桌面应用开发至关重要。 总之,"JAVA Swing中文离线API文档"是一个极其宝贵的资源,它可以帮助Java开发...
Swing 支持国际化和本地化,使应用能够适应不同语言环境。开发者可能使用了 `ResourceBundle` 和 `PropertyResourceBundle` 来管理翻译文本。 通过研究 "NewEditor" 文件,我们可以深入理解如何在Swing中实现一个...
Swing支持国际化和本地化,这使得开发者能够轻松地为不同地区的用户提供适应的语言环境。通过ResourceBundle类,可以加载不同语言的资源文件,实现多语言切换。 此外,Swing还引入了JOptionPane,它提供了一些预...