Swing弹出框的多语言支持
来源:互联网 发布:nginx访问php报404 编辑:程序博客网 时间:2024/05/08 10:35
客户的需求是,在Swing的弹出框里面显示俄文,比如Yes显示为Да(这特么是个啥)。话说现在真没什么人研究swing了,苦的一比。
看了一下在启动swing界面之前使用
就可以设置当前语言。
同样,在读源码后发现可以通过以下方式设置JComponent的默认Locale
结果发现JAVA Swing原生不支持通过设置Locale的方式把俄文显示在对话框上(没细查JDK是不是有全语言文字版本,我本机的JDK只有CN,de,es,fr,it,ja,ko,sv等语言,可看后文详解。)
同时,我死活没有找到这些显示的文字,例如"是(Y)","否(N)","Yes"之类的是在哪里放进去的。
这个问题只好一步一步反向查找了,切入点还是JButton的setText() jdk7U45
1. 断点在AbstractButton的setText(),发现传进来的文本实际上是由BasicOptionPaneUI$ButtonFactory工厂持有的
2.再断点在BasicOptionPaneUI$ButtonFactory的构造方法上,发现这个text是通过UIManager.getString("OptionPane.yesButtonText", l)方法生成的,l这个变量就是一个locale。
**********分割线****************
这里其实已经能解决问题了,UIManager提供了put方法,按照key把应该显示的值存进去就行了,但是作为刨根问底的程序猿,你能不往下看么?
******************************
3.这个值是啥时候放进UIManager的?
4.读UIManager的代码发现,这其实是个Cache的管理者,真正的缓存都放在了UIDefaults类里。可以看到UIDefaults是个容器:
5.还是要问了,UIDefaults什么时候设置的这个值?
6.断点在HashTable里。。。启动时候反向查了半天,终于有了端倪。
7.UIDefault里面有个resourceBundles,一看到bundle就联想到了国际化,所以断点到了UIDefault.addResourceBundle()
8.终于找到了com.sun.swing.internal.plaf.basic.resources.basic,以及同目录下的其他语言资源(这个类一看就是个sonar issue,说好的首字母大写呢)。
9.比较坑的是在JDK的rt源码调试时候,局部变量都是不可见的,并且传递参数都是以arg0,arg1这种形式显示在variable里面的。原因是下载的JDK默认编译都没加调试信息,所以调试起来比较痛苦。
10.解决方法可以利用JAVA_HOME的src.zip自己做个rt.jar,加上参数生成调试信息,帖子可以见R大的回帖:
http://hllvm.group.iteye.com/group/topic/25798#182845
和另外一个帖子:
http://zhaohaolin.iteye.com/blog/1887538
====完====
看了一下在启动swing界面之前使用
Locale.setDefault(Locale.CHINA);
就可以设置当前语言。
同样,在读源码后发现可以通过以下方式设置JComponent的默认Locale
AppContext.getAppContext().put("JComponent.defaultLocale", locale);
结果发现JAVA Swing原生不支持通过设置Locale的方式把俄文显示在对话框上(没细查JDK是不是有全语言文字版本,我本机的JDK只有CN,de,es,fr,it,ja,ko,sv等语言,可看后文详解。)
同时,我死活没有找到这些显示的文字,例如"是(Y)","否(N)","Yes"之类的是在哪里放进去的。
这个问题只好一步一步反向查找了,切入点还是JButton的setText() jdk7U45
1. 断点在AbstractButton的setText(),发现传进来的文本实际上是由BasicOptionPaneUI$ButtonFactory工厂持有的
2.再断点在BasicOptionPaneUI$ButtonFactory的构造方法上,发现这个text是通过UIManager.getString("OptionPane.yesButtonText", l)方法生成的,l这个变量就是一个locale。
**********分割线****************
这里其实已经能解决问题了,UIManager提供了put方法,按照key把应该显示的值存进去就行了,但是作为刨根问底的程序猿,你能不往下看么?
******************************
3.这个值是啥时候放进UIManager的?
4.读UIManager的代码发现,这其实是个Cache的管理者,真正的缓存都放在了UIDefaults类里。可以看到UIDefaults是个容器:
public class UIDefaults extends Hashtable<Object,Object>
5.还是要问了,UIDefaults什么时候设置的这个值?
6.断点在HashTable里。。。启动时候反向查了半天,终于有了端倪。
7.UIDefault里面有个resourceBundles,一看到bundle就联想到了国际化,所以断点到了UIDefault.addResourceBundle()
8.终于找到了com.sun.swing.internal.plaf.basic.resources.basic,以及同目录下的其他语言资源(这个类一看就是个sonar issue,说好的首字母大写呢)。
9.比较坑的是在JDK的rt源码调试时候,局部变量都是不可见的,并且传递参数都是以arg0,arg1这种形式显示在variable里面的。原因是下载的JDK默认编译都没加调试信息,所以调试起来比较痛苦。
10.解决方法可以利用JAVA_HOME的src.zip自己做个rt.jar,加上参数生成调试信息,帖子可以见R大的回帖:
http://hllvm.group.iteye.com/group/topic/25798#182845
和另外一个帖子:
http://zhaohaolin.iteye.com/blog/1887538
====完====
0 0
- Swing弹出框的多语言支持
- java swing 弹出框 实例
- java swing 类似Eclipse的错误消息弹出框
- Java--swing弹出框,多输入(选择)条件
- Java Swing 弹出对话框的使用
- Java Swing 弹出对话框的使用
- 程序的多语言支持
- 程序的多语言支持
- thinkphp的多语言支持
- ScriptCase的多语言支持
- android的多语言支持
- Swing:支持自动过滤的 JComboBox
- Swing所支持的事件监听器
- ios实现支持通讯录的手机号码输入弹出框
- bootstrap weebox,支持ajax的模态弹出框
- JS 弹出框(支持IFRAME)
- swing弹出对话框
- eclipse中swing中常用的弹出对话框
- 记录一下oracle培训的一些Tips
- WildFly(JBoss8) 启动时卡死问题解决
- 备忘:和公钥私钥证书相关的一些帖子
- cookie和session摘录笔记
- javascript中关键字in以及循环for...in的使用和注意事项
- Swing弹出框的多语言支持
- HttpClient多线程并发问题
- 使用maven+eclipse搭建Spring mvc+security的tutorial环境
- DDL小结
- Android各种类型Dialog点击空白处自动关闭问题
- Spring security oauth2最简单入门环境搭建--一、OAuth简介
- Spring security oauth2最简单入门环境搭建--二、干货
- Shibboleth IDP 的安装和部署配置步骤(Tomcat部署)
- 和身份认证相关的几个协议/标准