首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 冲浪宝典-> 邮件工具
Java用户界面本地化实例探索-JSP教程,Java技巧及代码
作者:网友供稿 点击:608
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
国际化是使程序具有足够的灵活性、能在世界上任何地区运行的过程。国际化所要求的必然结果是地方化――使一个程序能够运行在特定地区的过程。本文尝试用一个简单的例子来演示java用户界面本地化。java语言内核基于unicode3.0(java 1.4)提供了对不同国家和不同语言文字的内部支持,由于先天的原因,java对于国际化的支持远远要比c/c++来的优越。

  在我看来本地化必须满足以下的三个条件:

  1、程序必须能读、写和操作本地化的文本。

  2、程序在显示日期和时间、使数字格式化以及排序子串时,必须符合地方习惯。(通过java.text包里面的类可以实现这些要求)

  3、所有用户可见的文本都能在运行时获得,而不是直接写入程序中。(通过java.util包里的resourcebundle类和他的子类可以实现这些要求。)

  实现这三个方面可以真正实现程序的国际化。

  首先让我们来了解一下地区。地区代表一个地理上、政治上或文化上的区域。在java中,地区由java.util.locale类表示。地区常常以一种语言来定义,该语言则由其标准的小写双字母代码表示。(例如:en代表英国,fr代表法国,zh代表中国),但有时候语言是不能代表一个地区的,那就要在语言后面再加上一个国家或该国家的地域(例如:en_us代表美国,zh_tw)。locale类保存着一个静态的默认地区,它可以用locale.setdefault()和locale.getdefault()来设置和查询。一个程序可以生成和使用任意数目的非默认locale对象。

  让我们再来看一下unicode字符编码。java使用unicode的字符编码,其本身就是迈向国际化的一大步。unicode编码其每个字符都占两个字节。用\u****的形式表示。unicode的字符可以等价于其他编码的字符(例如:从\u0020到\u007e的字符等价于ascii和iso8859-1字符的0x20到0x7e)。

  本文主要是对用户界面地方化,由于我使用的是资源束!所以有必要对资源束作一下解释。

  为定义一束地方化的资源,你需要生成一个resourcebundle(资源束)的子类并且提供handlegetobject()和getkeys()方法的定义。为了在程序中使用来自resourcebundle的地方化资源,就需要先调用静态的getbundle()方法,用getbundle()获得一个resourcebundle对象,然后再用getobject()方法去按照名字来查找资源。当然也可以使用getstring()简单的把getobject()的返回值分配给一个string对象。getbundle()方法采用basename_language_country_variait----没找到的话->basename_language_country----没找到的话->basename_language----没找到的话->basename(默认资源文件)的算法寻找合适的资源。如果以上都没找到的话,则会抛出一个missingresourceexception异常。

  现在我们来看一个简单的例子,如何使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://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·25m的hotmail免费邮箱申请方法
·用C#下的Raw Socket编程实现网络封包监视-.NET教程,C#语言
·Java JDBC连接的一个例子-JSP教程,Java技巧及代码
·Java Swing入门基础-JSP教程,Java技巧及代码
·Java用户界面本地化实例探索-JSP教程,Java技巧及代码
·有数据绑定、排序、查找功能的ListView(一)-.NET教程,数据库应用
·有线电视3信号放大器特点及常见故障分析
·[ASP.NET]使用C#开发Socket通讯-.NET教程,C#语言
·Session 详解-ASP教程,ASP应用
·ASP.net 2005 Treeview 无限分类非地递归终极解决方案-.NET教程,Asp.Net开发
最新文章
·做google月入一万rmb提示交流_网赚技巧
·英文视频:google adsense技巧视频教程_网赚技巧
·专访51auto创始人:5句话融到4000多万_站长访谈
·站长访谈—sen:骨灰级站长的10年网络生涯_站长访谈
·站长访谈:天涯—曾经的hacker,现在的我_站长访谈
·个人网站如何才能成功?_站长心得
·网站如何获得成功?确定目标是关键_站长心得
·blog广告新创意:review me_站长心得
·利用dns技术解决internet南北互访_站长心得
·googleadsense常用技巧总结_google推广
相关主题
  • java用于链接数据库的例子(*.properties)-JSP教程,资料/其它
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭