`
carlkkx
  • 浏览: 16397 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

javaGUI字体讨论

阅读更多

我们知道java有5种逻辑字体,分别是 SerifSanserifMonospaceDialog 以及 DialogInput。当你在程序中比如

UIDefaults ui = UIManager.getLookAndFeelDefaults();

ui.put("TextArea.font", new FontUIResource("DialogInput", Font.BOLD, 14));

 

这样你对所有TextArea默认的字体设置成DialogInput了,但是DialogInput到底对应什么字体呢?这就取决于你的程序所在JRE的情况了,

$JRE_HOME/lib/fontconfig.properties.*文件定义了这5种逻辑字体分别映射到哪些具体的字体,不同的平台下情况可能不同,你当然也可以修改这个配置。

如果这个配置文件定义某个具体字体不存在,那么你的java程序字符显示就会出现”口口口口口口口口口口口口“。所以有时候一个程序某些平台上跑的好好的,

到另一个平台就会出现”口口口口口口口口口口口口“。

现在假设您直接设置某个具体字体,而不是逻辑字体,那么当然你就没有映射的问题,比如

UIDefaults ui = UIManager.getLookAndFeelDefaults();

ui.put("TextArea.font", new FontUIResource("Comic Sans MS", Font.BOLD, 20));

但是这样,如果你的目标平台上没有Comic Sans MS,也会出现”口口口口口口口口口口口口“,另外,一种字体也是有它对应支持的字符集的而不是什么字符都能支持的,比如"Comic Sans MS”这种字体不能支持中文,所以即使你的系统存在"Comic Sans MS"字体,但是在TextArea输入中文的时候也会出现”口口口口口口口口口口口“。

那么如果我打开NetBeans,画了个画面,不做什么设置,然后运行,一切OK,这时是什么字体呢?

获得 UIDefaults ui = UIManager.getLookAndFeelDefaults();然后遍历发现:

ToggleButton.font:javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12]
ComboBox.font:javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12]
ScrollPane.font:javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=plain,size=12]
Spinner.font:javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12]
RadioButtonMenuItem.font:javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12]
Slider.font:javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=bold,size=12]
EditorPane.font:javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=plain,size=12]
OptionPane.font:javax.swing.plaf.FontUIResource[family=Dialog,name=Dialog,style=plain,size=12]

。。。。。。。。。。。。。。。。。。。。。

都是Dialog字体,如果我在加一行代码:UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

我是在Windows环境下,所以应该得到Windows的LookAndFeel。

这时再遍历发现:

ToggleButton.font:javax.swing.plaf.FontUIResource[family=SimSun,name=宋体,style=plain,size=12]
ComboBox.font:javax.swing.plaf.FontUIResource[family=SimSun,name=宋体,style=plain,size=12]
ScrollPane.font:javax.swing.plaf.FontUIResource[family=SimSun,name=宋体,style=plain,size=12]
Spinner.font:javax.swing.plaf.FontUIResource[family=SimSun,name=宋体,style=plain,size=12]
RadioButtonMenuItem.font:javax.swing.plaf.FontUIResource[family=SimSun,name=宋体,style=plain,size=12]
Slider.font:javax.swing.plaf.FontUIResource[family=SimSun,name=宋体,style=plain,size=12]
EditorPane.font:javax.swing.plaf.FontUIResource[family=SimSun,name=宋体,style=plain,size=12]
OptionPane.font:javax.swing.plaf.FontUIResource[family=SimSun,name=宋体,style=plain,size=12]

。。。。。。。。。。。。。。。。。。。。。

是宋体,是一个具体字体而不是逻辑字体,说明Swing几个内置的实现几个主要系统的LookAndFeel,会设置对应系统常用字体,比如因为我是

Windows系统所以配了宋体,想必只要是中文Windows系统不可能没有宋体吧。

现在很多人写的Swing程序,一般也不会特地去设定自己的字体,而是没设,然后一般又会加载当前系统的LookAndFeel,所以会写上一句

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

但是听说有些Swing程序在Windows好的到了其他环境出现”口口口口口口口口口口口口“,如果是以上的写法(没有特地设置过字体),那么按理说

会设置对应系统常用字体,如果因为目标系统没有这个字体,而出现”口口口口口口口口口口口口“,对于Swing对应LookAndFeel的实现来说一定找的是

常用字体,为何目标系统会缺乏呢?是目标系统的错还是java的错?java对于常用字体的判定错误?我就不清楚了。

 

所以理论上来说如果我不设置字体,并且写UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());那么对应LookAndFeel会设定一个默认对应系统的常用字体,如果实现的好,那么确实是运行各个环境都没有问题。但是现实是没有那么完美。当然还有很多第三方LookAndFeel,他们对于UIDefaults的设置是什么,可以通过 UIManager.getLookAndFeelDefaults();获得。

 

 

这上面说的是Swing,但是AWT组件默认的字体是怎样决定呢?这个本来也真没想管它,因为本更不会去用AWT组件,但是当我要做系统托盘图标的时候发现问题来了,因为SystemTray st = SystemTray.getSystemTray();然后st可以加入TrayIcon,而TrayIcon只能放PopupMenu,注意是PopupMenu而不是JPopupMenu,所以是AWT组件,然后构造MenuItem放入PopupMenu,如果传入MenuItem的是中文字符,结果运行点击托盘图标时菜单出现”口口口口口口“了。我调用item.getFont()查看字体,但是MenuItem返回的是null,这下我不解了,查查资料也没有结果,所以关于AWT组件这个问题我也不清楚,有人是否能解释一下呢?其实关于字体,这里说的还不够,真希望有更全面的解释一下这个主题。

 

 

 

 

 

 

分享到:
评论
4 楼 zeronelee 2010-07-20  
系统托盘我也遇到过,一直没有解决。
3 楼 carlkkx 2009-07-24  
其实这也引出了另外一个问题,就是java到底如何获得本地操作系统的当前字符集而不仅仅是java VM的当前字符集?因为java VM的当前字符集完全可以在VM启动时设定的,它很可能和本地操作系统不一致。
2 楼 carlkkx 2009-07-24  
又有了一些进展,原来对源代码文件的编码方案设定会影响java的“file.encoding”属性,自然也就影响到比如String的getbytes()方法的结果,getbytes()方法的文档里面解释似乎是依据本地平台的编码方案进行Byte化,我一开始理解为就是按本地操作系统的字符集来byte化,但是实际上不一定,因为VM启动时有个参数可以设定的,就是-Dfile.encoding=XXX ,而IDE开发环境似乎会根据你的源代码文件的编码方案来对VM设定这个参数,但是如果你强行设定了这个参数,那么就以你设定的为准。
所以我源代码编码方案还是“UTF-8”,但是我VM启动参数里面加了这一行-Dfile.encoding=GBK,那么运行结果最后也是正常的。可见AWT机制相当粗糙,它可能会对字符串直接getbytes(),然后会将这堆bytes再调用本地操作系统API,比如我在Windows上的话,本地操作系统的当前字符集是GBK,而这堆Bytes是以UTF-8编码的,windows的API如果以GBK解它的话,自然也就完蛋了。
1 楼 carlkkx 2009-07-23  
关于MenuItem中文字符”口口口口口口“问题来源我找到了,我的源代码文件是UTF-8在Eclipse里面改为GBK后,再运行能正常显示中文,我觉得这很奇怪,为什么要判定我的源代码文件编码方案呢?
我再改回UTF-8,然后打包出去,然后运行打包后的jar,发现没有问题,可以显示,但是如果在Eclipse里面运行就会有”口口口口口口“,这下我晕了,这是为什么啊?难道Eclipse依据我的源代码编码方案向VM传了什么参数,然后AWT依据这个参数的设置来处理,然后出现了问题”口口口口口口“。毕竟打包出去的jar没有”口口口口口口“。
Swing的组件是没有这个问题的,AWT的机制到底是怎样的呢?
望诸位解释解释啊。

相关推荐

    生命游戏javaGUI实现界面十分美观

    本文将详细讨论如何使用Java图形用户界面(GUI)技术来实现一个美观的生命游戏界面。Java GUI为我们提供了丰富的组件和工具,可以创建出互动性强、视觉效果良好的应用程序。我们将主要关注以下几点: 1. **Java GUI...

    Java-GUI人员管理程序

    下面将详细讨论Java GUI以及在这个程序中可能涉及的关键技术点。 首先,Java GUI是Java提供的用于创建用户界面的一组类库,它允许开发者设计出具有丰富交互性的图形界面。在Java中,我们可以使用Java Foundation ...

    java GUI编程

    在这个特定的案例中,我们讨论的是一个利用Java GUI编写的定时关机程序。这个程序允许用户设定一个时间,然后系统会在指定时间自动关闭。让我们深入探讨Java GUI编程中的关键知识点,以及如何在实际应用中实现定时...

    Java_Swing-fontchoose.rar_java控件字体_swing Font

    在Java Swing中,我们可以创建各种交互式的用户界面,包括按钮、文本框、菜单等,以及本文讨论的重点——字体选择器。 在Java Swing中,创建一个字体选择器是为了让用户能够自由地选择显示或编辑文本时所用的字体。...

    基于Java实现的(GUI)万年历【100013205】

    在本项目中,我们讨论的是一个基于Java编程语言实现的图形用户界面(GUI)应用程序,称为"万年历"。这个程序允许用户查看并查询从公元1年到9999年间任意日期对应的星期。万年历是日常生活中常用的一个工具,能够帮助...

    GUI界面操作

    下面将详细讨论GUI界面中的各个组成部分以及它们的操作方法。 首先,GUI界面的基础单元是容器(Container)。容器是放置其他组件(Component)的区域,它可以是窗口(Window)、面板(Panel)、框架(Frame)等。在...

    java技能百练\特效\动态文字

    本文将深入探讨如何使用Java实现动态文字的实例,基于标题“java技能百练\特效\动态文字”和描述中的内容,我们将重点讨论以下几个知识点: 1. **Swing或JavaFX库**: 动态文字的实现通常涉及到图形用户界面(GUI...

    Java实现的多标签记事本

    通过分析源码,学习如何使用Java Swing组件构建GUI,以及如何处理文本操作和用户设置,对于Java GUI编程的学习者来说是一份宝贵的资料。 总的来说,这款Java实现的多标签记事本是一个集实用性与学习价值于一体的...

    java swing开发的模仿windows记事本的应用程序

    Java Swing 是Java GUI(图形用户界面)库的一部分,它提供了丰富的组件和工具,用于构建桌面应用程序。在这个项目中,开发者使用Java Swing模仿了Windows操作系统中的记事本程序,实现了基本的文字编辑功能,并添加...

    JAVA写的记事本程序

    下面将详细讨论Java记事本程序的相关知识点。 1. **Java GUI编程**: - Java记事本程序使用了Java的图形用户界面(GUI)库,如Java Swing或JavaFX来创建窗口和控件。Swing是Java标准版(J2SE)的一部分,提供了...

    java写的写字板程序

    这个标题表明我们讨论的是一个使用Java编程语言实现的类似Windows写字板的应用程序。写字板是操作系统中常见的文本编辑工具,它允许用户创建、编辑和保存简单的文本文件,而这个Java程序旨在复现这些功能。 【描述...

    Java_2_图形设计卷Ⅰ--AWT.doc

    Java 2 图形设计卷Ⅰ--AWT 是一本深入探讨Java图形用户界面(GUI)开发的文档,主要聚焦在Java的Abstract Window Toolkit(AWT)库。AWT是Java早期提供的一套用于创建图形界面的基本组件和工具,它是Java GUI编程的...

    Java写的巨型LCD液晶时钟显示屏

    在这个特殊的案例中,我们讨论的是一个使用Java实现的大型LCD液晶时钟显示屏。这个项目可能是为了教学、实验或者实际应用,比如在一个展览或者公共空间展示时间。下面将详细探讨相关知识点。 1. **Java GUI(图形...

    java——Graphics.pdf

    在这个讨论中,我们将深入理解Java GUI重绘机制、`Graphics`类以及如何有效地使用`repaint()`方法。 首先,`repaint()`方法是Java GUI组件更新界面的主要手段。当组件的状态发生变化,比如改变其尺寸、位置或者内容...

    java文本编辑器.zip

    这个项目可能是作为Java编程学习者的毕业设计,或者是为研究Java GUI(图形用户界面)和文本处理技术的学生提供的一种实践平台。在这款编辑器中,用户可以进行基本的文本编辑操作,如新建、打开、保存文件,以及剪切...

    corejava.zip

    第10章介绍GUI程序设计,讨论如何建立窗口、如何在窗口中绘图、如何利用几何图形绘图、如何采用多种字体格 式化文本,以及如何显示图像;第11章详细讨论抽象窗口工具包的事件模型;第12章详细讨论Swing GUI工具包;...

    设置字体,颜色

    在IT行业中,尤其是在图形用户界面(GUI)设计和编程中,设置字体、线宽和颜色是至关重要的元素,它们直接影响到应用的可读性、美观度以及用户体验。本主题将详细探讨这些知识点。 首先,我们来看“设置字体”。...

    Jfc

    描述中的"Jfc"可能是对Java GUI开发基础的简要提及,暗示我们将讨论的内容与使用JFC进行图形界面设计有关。 "字体"这个标签,意味着我们将在讨论中涉及到如何在JFC/Swing中管理和使用字体。在JFC中,可以通过`javax...

    jd-gui-windows-1.4.0.zip_jd gui 1.4_jd-gui_jdGUIWindows

    标题中的"jd-gui-windows-1.4.0.zip_jd gui 1.4_jd-gui_jdGUIWindows"揭示了我们讨论的是JD-GUI的1.4.0版本,专为Windows操作系统设计。这个压缩包包含了所有必要的文件,让用户能够在Windows环境下快速安装和使用JD...

Global site tag (gtag.js) - Google Analytics