`
lifethinker
  • 浏览: 72084 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Ubuntu中不能使用SystemLookAndFeel的问题

阅读更多
环境:Ubuntu 7, Java 6

在Ubuntu使用Java来编写Swing应用程序时一个比较大的问题就是不能使用SystemLookAndFeel。

import javax.swing.*;

public class DesktopApp {
	public static void main(String[] args) throws Exception {
		UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
		JFrame frame = new JFrame("My Frame");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().add(new JButton("Click"));
		frame.pack();
		frame.setVisible(true);
	}
}


运行抛出异常:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at com.sun.java.swing.plaf.gtk.GTKLookAndFeel.initSystemColorDefaults(GTKLookAndFeel.java:1267)
	at com.sun.java.swing.plaf.gtk.GTKLookAndFeel.loadStyles(GTKLookAndFeel.java:1509)
	at com.sun.java.swing.plaf.gtk.GTKLookAndFeel.access$000(GTKLookAndFeel.java:37)
	at com.sun.java.swing.plaf.gtk.GTKLookAndFeel$WeakPCL$1.run(GTKLookAndFeel.java:1449)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
Exception in thread "main" java.lang.NullPointerException
	at javax.swing.plaf.synth.SynthLookAndFeel$AATextListener.propertyChange(SynthLookAndFeel.java:793)
	at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:339)
	at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:347)
	at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:276)
	at java.awt.Toolkit.setDesktopProperty(Toolkit.java:1784)
	at sun.awt.SunToolkit.fireDesktopFontPropertyChanges(SunToolkit.java:1714)
	at sun.awt.SunToolkit.setAAFontSettingsCondition(SunToolkit.java:1759)
	at sun.swing.SwingUtilities2$AATextInfo.getAATextInfo(SwingUtilities2.java:119)
	at com.sun.java.swing.plaf.gtk.GTKLookAndFeel.initComponentDefaults(GTKLookAndFeel.java:1258)
	at com.sun.java.swing.plaf.gtk.GTKLookAndFeel.getDefaults(GTKLookAndFeel.java:294)
	at javax.swing.UIManager.setLookAndFeel(UIManager.java:537)
	at javax.swing.UIManager.setLookAndFeel(UIManager.java:581)
	at DesktopApp.main(DesktopApp.java:9)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at com.sun.java.swing.plaf.gtk.GTKLookAndFeel.initSystemColorDefaults(GTKLookAndFeel.java:1267)
	at com.sun.java.swing.plaf.gtk.GTKLookAndFeel.loadStyles(GTKLookAndFeel.java:1509)
	at com.sun.java.swing.plaf.gtk.GTKLookAndFeel.access$000(GTKLookAndFeel.java:37)
	at com.sun.java.swing.plaf.gtk.GTKLookAndFeel$WeakPCL$1.run(GTKLookAndFeel.java:1449)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)


一种解决办法就是不使用SystemLookAndFeel,那么去掉
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

就可以了,或者将
System.setProperty("swing.systemlaf", "javax.swing.plaf.metal.MetalLookAndFeel");
添加到程序的最前面,那么表示即使调用UIManager.getSystemLookAndFeelClassName()也会返回CrossLookAndFeel。

如果确实要使用SystemLookAndFeel,可以在程序最前面添加:
UIManager.getLookAndFeelDefaults()
就能够看到SystemLookAndFeel,是不是很怪异?

上面讲的是可以改源码的情况下可以使用的方式,如果不能修改源码,那就只能在程序启动时传递-Dswing.systemlaf=javax.swing.plaf.metal.MetalLookAndFeel。比如对于groovy,如果不做任何设置,运行groovySh就会出现前面出现的异常,解决方法就是使用groovySh -Dswing.systemlaf=javax.swing.plaf.metal.MetalLookAndFeel。每次都输入这么长是很麻烦的,你可以修改bin目录下的startGroovy脚本,在脚本顶端添加:
JAVA_OPTS=-Dswing.systemlaf=javax.swing.plaf.metal.MetalLookAndFeel
这种方式应该对大多数java程序都适用,除非你特别钟情于SystemLookAndFeel。但不幸的是,对于"非java"程序(这里”非java"也包括并不是全部用java写的),如果jconsole我就一直没有找到方法来启动它,不知大家有没有好的方法?

我本来想export swing.systemlaf=javax.swing.plaf.metal.MetalLookAndFeel,系统却抱怨swing.systemlaf不是一个合法的变量名,很是郁闷!
分享到:
评论
3 楼 lifethinker 2008-07-26  
多谢ivan,在eclipse试了一下,果然是这样的,没想到还可以用这样的方式设置系统属性,学了一招。虽然现在已经改用kubuntu了,在kubuntu下没有这样的问题。
2 楼 ivan 2008-07-25  
可以修改 /etc/environment 文件在最后增加上:
_JAVA_OPTIONS="-Dswing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel"
1 楼 无聊神灯 2008-06-06  
export LANG=en

相关推荐

    解决Ubuntu下pycharm光标不跟随的问题

    标题中的问题“解决Ubuntu下PyCharm光标不跟随的问题”涉及到的是在Ubuntu操作系统中使用PyCharm IDE时遇到的一个常见故障。PyCharm是一款由JetBrains公司开发的专业Python集成开发环境,它提供了丰富的功能来支持...

    Win10与Ubuntu双系统开机不能进入Ubuntu的问题

    如果在这个过程中出现问题,可能是因为引导管理器的配置被更改,或者是由于系统更新导致的不兼容问题。 一、UEFI与Legacy BIOS的区别 在了解如何解决问题之前,我们先要区分UEFI和Legacy BIOS两种不同的启动模式。...

    Ubuntu下QT显示中文乱码问题.docx

    在 Ubuntu 系统中,使用 QT 库开发应用程序时,可能会出现中文乱码的问题。这种情况下,需要解决中文乱码问题,以确保应用程序的正确显示。本文将详细介绍 Ubuntu 下 QT 显示中文乱码问题的解决方案。 问题描述 在...

    Ubuntu下使用Tomcat搭建网站出现中文乱码的问题.docx

    Ubuntu下使用Tomcat搭建网站出现中文乱码的问题 在 Ubuntu 操作系统下使用 Tomcat 搭建网站时,可能会出现中文乱码的问题。这是由于字符集的不统一所致。为了解决这个问题,需要统一服务器的字符编码,包括 Linux ...

    Ubuntu中文语言包显示菱形问题恢复方法

    在使用Ubuntu系统的过程中,部分用户可能会遇到中文语言包显示异常的问题,其中一种常见的现象就是文本显示为菱形符号,这通常意味着系统无法正确解析或显示中文字符。这种问题的出现,往往与系统的语言环境设置有关...

    ubuntu方向键不能使用

    - 桌面导航:在图形界面中使用方向键进行菜单选择或窗口导航时出现问题。 #### 二、解决方案 1. **检查键盘驱动**: - 进入“系统”->“首选项”->“键盘”,确保键盘布局设置正确。 - 在“键盘布局”选项卡中...

    增强会话 解决Hpery-V安装Ubuntu不能 在win之间粘贴复制的问题 linux-vm-tools-master.zip

    然而,在默认配置下,Hyper-V中的Ubuntu虚拟机可能会遇到一些问题,例如无法在Windows主机和Ubuntu虚拟机之间进行复制粘贴操作,以及鼠标移动延迟和画面卡顿等。这些问题对于日常开发或测试工作来说,极大地影响了...

    在ubuntu中安装wine使用windows软件

    如果需要手动指定Wine来运行某个程序,可以在终端中使用命令`wine your_program.exe`。 #### 四、注意事项 - 安装过程中可能出现依赖问题或缺少某些组件,此时可尝试重新安装或使用WineHQ的安装脚本进行安装。 - ...

    ubuntu安装显卡后无线不能使用解决办法

    针对“ubuntu安装显卡后无线不能使用”的问题,这里提供一种解决方法,该方法适用于Ubuntu 11.10版本,但对于13.10之后的版本未进行测试。 首先,我们需要确认无线网络是否被软禁用或硬禁用。通过运行`rfkill list`...

    SeedUbuntu虚拟机使用手册1

    在SeedUbuntu虚拟机使用手册1中,可能出现的一些问题包括虚拟机无法启动、docker安装失败、镜像创建失败等等。用户可以根据手册中的解决方案来解决这些问题。 应用软件 在SeedUbuntu虚拟机使用手册1中,应用软件是...

    如何在ubuntu18.04中设置使用中文输入法的使用

    ubuntu 在最新的版本中已经可以不用用户自己单独去下载中文输入法使用了,本次使用为 ubuntu18.04LTS版本(登陆是界面选择的是ubuntu on wayland),设置方式非常简单 1、打开设置,不知道的请点击右上角的工具栏即可...

    Ubuntu Server环境下中文乱码之显示方块.docx

    在 Ubuntu Server 环境下,中文乱码的问题是一个常见的问题,特别是在桌面环境和浏览器中。在这个文件中,我们将讨论 Ubuntu Server 环境下中文乱码之显示方块的问题,并提供相应的解决方案。 问题描述 在 Ubuntu ...

    ubuntu mysql中中文乱码问题.docx

    在 Ubuntu 系统中,MySQL 数据库中文乱码问题是一个常见的问题。乱码问题可能是由于 MySQL 数据库的字符编码设置不正确所致。解决这个问题需要对 MySQL 数据库的字符编码进行设置和调整。 标题解释 本文档的标题...

    ubuntu16.04中安装使用docker

    ubuntu16.04中安装使用dockerubuntu16.04中安装使用docker

    Ubuntu12.10_菜鸟使用手册(一).pdf

    手册中还提到了在Ubuntu中使用命令行安装软件的简便性。用户只需要输入一行命令,就可以快速安装一系列软件,如smplayer, subdownloader, banshee, radiotray, stardict, dconf-tools, uget, deluge, conky, ssh, ...

    ubuntu字符界面中文乱码 - chinabinlang的专栏 - CSDN博客1

    Ubuntu 字符界面中文乱码是指在 Ubuntu 系统中,字符界面无法正常显示中文字符的问题。这种问题的出现可能是因为 Ubuntu 的默认设置不支持中文显示,或者是因为系统的 locale 设置不正确。 解决方案一:安装 zhcon...

    Ubuntu系统下Ecipse的安装及不能启动的解决办法

    概述:本文档介绍了在Ubuntu系统下安装Ecipse的步骤,并解决了Ecipse不能启动的问题。Ecipse是基于Java开发的集成开发环境(IDE),广泛应用于软件开发、测试和调试。Ubuntu系统下安装Ecipse可以通过Ubuntu软件中心...

    非常详尽的Ubuntu 系统安装使用手册.pdf

    使用UltraISO软件打开Ubuntu的ISO镜像文件,然后将其写入到U盘中,这样你就有了一个可引导的Ubuntu安装U盘。 安装Ubuntu的过程中,用户可以选择不同的安装类型,如最小安装、桌面安装或者自定义安装。在安装过程中...

    ubuntu下vi不能用修改方法

    然而,有些用户在升级或安装新的Ubuntu版本后,可能会遇到无法正常使用`vi`编辑器进行文本编辑的问题,比如退格键不起作用或者删除字符时出现异常。这通常是由于系统默认安装的是精简版的`vi`,而不是功能更完善的`...

    ubuntu环境修下MyEclipse键盘失灵问题

    在Ubuntu环境下使用MyEclipse开发工具时,可能会遇到键盘输入异常的问题,即键盘输入不响应或者输入延迟等现象。这不仅会影响工作效率,还会导致编码过程中的诸多不便。本文将详细介绍如何在Ubuntu环境中解决...

Global site tag (gtag.js) - Google Analytics