分享
 
 
 

Java用户界面本地化就这么简单之实战

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

看了“Java用户界面本地化就这么简单之理论”,想必你对国际化有了些了解!现在我们来看一个简单的例子,如何使Java程序用户界面地方化的。

首先我们的程序需要查找特定Locale对象关联的资源包,所以应该定义一个Local对象,来获取本地默认的地区!然后可以调用ResourceBundle的getBundle方法,并将locale对象作为参数传入。

清单一:

Locale locale = Locale.getDefault(); //获取地区:默认

//获取资源束。如未发现则会抛出MissingResourceException异常

ResourceBundle bundle = ResourceBundle.getBundle("Properties.Dorian",locale);

清单一中的”Properties.Dorian”代表Properties包下以Dorian命名的默认资源文件。

这样就可以使用资源文件了!让我们来看看资源文件是如何定义的。

清单二:

# Dorian.properties是默认的"Dorian"资源束文件。

# 作为中国人,我用自己的地区作为默认

Title=\u4e2d\u56fd

red.label=\u7ea2\u8272

green.label=\u7eff\u8272

blue.label=\u84dd\u8272

清单三:

# 文件Dorian_en_US.properties,是美国地区的资源束

# 它覆盖了默认资源束

Title=America

red.label=Red

green.label=Green

blue.label=Blue

清单一和二定义了一个默认资源文件,和美国地区的资源文件。其中等号左边的字符串表示主键,它们是唯一的。为了获得主键对应的值,你可以调用ResourceBundle类的getString方法,并将主键作为参数。此外,文件中以“#”号开头的行表示注释行。需要注意的是清单二中的“\u4e2d\u56fd”,它是字符“中国”的Unicode字符码。是使用Java自带的native2ascii工具转换的(native2ascii in.properties out.properties),这是为了不在程序界面中产生乱码。

清单四:

cmdRed.setText(bundle.getString("red.label"));

cmdBlue.setText (bundle.getString("blue.label"));

cmdGreen.setText (bundle.getString("green.label"));

清单二中的cmdRed、cmdBlue、cmdGreen 为按钮。bundle.getString("red.label")为得到资源文件中主键是red.label的值。

好了到此为止Java程序用户界面的本地化就是这么简单^_^不过,要提醒你的是在为用户界面事件编写事件监听器代码时,要格外小心。请看下面这段代码。

清单五:

public class MyApplet extends Japplet implements ActionListener{

public void init(){

JButton cancelButton=new JButton(“Cancel”);

CancelButton.addActionListener(this);

。。。

}

public void actionPerformed(ActionEvent e){

String s=e.getActionCommand();

if(arg.equals(“Cancel”);

doCancel();

else ……

}

}

如果你对清单五的代码不进行本地化,她就可能会运行的很好。但当你的按钮被本地化为中文时,“Cancel”变为了“取消”。这时就…………下面有三个方法可以消除这个潜在的问题!

1> 使用内部类而不使用独立的actionPerformed程序。

2> 使用引号而不使用标签来标识组件。

3> 使用name属性来标识组件

本例稍后的代码就是采用第一种方法来消除这个问题的。

清单六:完整的代码

//:MyNative.java

/**

Copyright (c) 2003 Dorian. All rights reserved

@(#)MyNative.java 2003-12-21

@author Dorian

@version 1.0.0

visit http://www.Dorian.com/Java/

*/

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.util.*;

/**

这是一个将Java程序界面地方化的例子

本例采用读取属性文件来达到目的

@see java.util.Locale;

@see java.util.ResourceBundle;

@see java.util.MissingResourceException;

*/

public class MyNative{

public static void main(String[] args){

JFrame frame = new MyNativeFrame();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setResizable(false);

frame.setVisible(true); // Pop the window up.

}

}

class MyNativeFrame extends JFrame{

public MyNativeFrame(){

Locale locale = Locale.getDefault();//获取地区:默认

//获取资源束。如未发现则会抛出MissingResourceException异常

//"Properties.Dorian"为在Properties下以Dorian为文件名的默认属性文件

ResourceBundle bundle = ResourceBundle.getBundle(

"Properties.Dorian",locale);

setTitle(bundle.getString("Title"));//通过getString()的返回值来设置Title

setSize(WIDTH,HEIGHT); // Set the window size.

panel=new MyNativePanel();

Container contentPane=getContentPane();

contentPane.add(panel);

//通过获取资源束中*.label的值对三个按钮设置其Label

panel.setCmdRed(bundle.getString("red.label"));

panel.setCmdBlue(bundle.getString("blue.label"));

panel.setCmdGreen(bundle.getString("green.label"));

}

private MyNativePanel panel;

private static final int WIDTH=400;

private static final int HEIGHT=100;

}

class MyNativePanel extends JPanel{

public MyNativePanel(){

layout=new BorderLayout();

setLayout(layout);

txt=new JTextField(50);

add(txt,layout.CENTER);

cmdRed=new JButton();

cmdBlue=new JButton();

cmdGreen=new JButton();

panel.add(cmdRed);

panel.add(cmdBlue);

panel.add(cmdGreen);

add(panel,layout.SOUTH);

cmdRed.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){

String s = e.getActionCommand();

txt.setBackground(Color.red);

txt.setText(s);

}

});

cmdBlue.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){

String s = e.getActionCommand();

txt.setBackground(Color.blue);

txt.setText(s);

}

});

cmdGreen.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){

String s = e.getActionCommand();

txt.setBackground(Color.green);

txt.setText(s);

}

});

}

public void setCmdRed(String s){

cmdRed.setText(s);

}

public void setCmdBlue(String s){

cmdBlue.setText(s);

}

public void setCmdGreen(String s){

cmdGreen.setText(s);

}

JPanel panel=new JPanel();

BorderLayout layout;

private JTextField txt;

private JButton cmdRed,cmdBlue,cmdGreen;

}

//~

资源文件:

# Dorian.properties是默认的"Dorian"资源束文件。

# 作为中国人,我用自己的地区作为默认

Title=\u4e2d\u56fd

red.label=\u7ea2\u8272

green.label=\u7eff\u8272

blue.label=\u84dd\u8272

# 文件Dorian_en_US.properties,是美国地区的资源束

# 它覆盖了默认资源束

Title=America

red.label=Red

green.label=Green

blue.label=Blue

# 文件Dorian_zh_CN.properties,是中国大陆地区的资源束

# 这个文件没有任何资源定义,从默认中国资源束继承

以下是这个程序远行后的截屏!

参考资料:

完整代码包下载

http://sxhv998.y365.com/java/Native.rar

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有