`
lifethinker
  • 浏览: 71299 次
  • 性别: 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

相关推荐

Global site tag (gtag.js) - Google Analytics