环境: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不是一个合法的变量名,很是郁闷!
分享到:
相关推荐
解决Win10与Ubuntu双系统 开机不能 进入Ubuntu的问题,更换启动项目和顺序的方法
Ubuntu中Vi不能正常使用方向键问题
解决UBUNTU 10.10下大多鼠标左键不能正常使用的问题驱动安装包~
鉴于有些vmware中的ubuntu不能联网问题,我从网上搜到些资料并结合自己的经历总结了一下,希望对大家有用
解决较低版本ubuntu系统中方向键有可能不能使用的问题
ubuntu16.04中安装使用dockerubuntu16.04中安装使用docker
在Ubuntu下解决MySQL不能远程访问的问题.docx
手把手教你在Ubuntu中怎么打中文,图文并貌
ubuntu中使用飞信!!ubuntu中使用飞信!!ubuntu中使用飞信!!ubuntu中使用飞信!!ubuntu中使用飞信!!
解决Hpery-V安装Ubuntu不能 在win之间粘贴复制的问题,开启增强会话模式,降低鼠标延迟,画面卡顿,提升流畅度
有些教程会教你怎么在进入系统后在配置文件中永久修改成quiet splash nomodeset,不过我没用到,所以就不写了。 2. 我进入系统后,发现不能调亮度。这是因为显卡被禁了。在终端输入sudo apt-get update和sudo apt-...
Ubuntu中文语言包显示菱形问题恢复方法
Ubuntu下QT显示中文乱码问题.docx
ubuntu11.10安装完成后无线不能使用解决办法 亲测有效(ubuntu 13.10之后未测试)
wine是一款用于虚拟使用windows的软件,你可以登陆官方网站,http://www.winehq.org /download 参看各种linux的安装方法,因为是国外的网站,都是英文,这里我只把在ubuntu中安装的方法翻译给大家,仅供参考,因为...
解决ubuntu中vim显示中文乱码的问题
解决ubuntu下文件中中文乱码问题,解决大家在ubuntu下不能查看中文文档的困扰,让大家很好地使用ubuntu系统完成日常所有所需工作
设置虚拟机不能联网是很痛苦的,这里我就ubuntu的NAT上网问题就个人经验讲一下,其他的桥连接等没有使用就没有经验了。 ubuntu版本:ubuntu-16.04-desktop-amd64.iso 1.查看/设置下NAT的网络 打开VMware Workstation...
在Ubuntu 18.04系统中使用Netplan工具配置网络,前几天电脑安装ubuntu18.4,发现上不去网,就在网上找了找资料,整理成文档,让下一位上不去网的同学,不用到处找了。
Ubuntu下使用Tomcat搭建网站出现中文乱码的问题.docx