Java和Windows外观与感觉

8

我制作了一个用于扫描图像的Swing应用程序;每个图像由树上的叶子表示。

我遇到的问题是它抛出了这个异常。

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at com.sun.java.swing.plaf.windows.XPStyle$Skin.getWidth(XPStyle.java:513)
    at com.sun.java.swing.plaf.windows.XPStyle$Skin.getWidth(XPStyle.java:517)
    at com.sun.java.swing.plaf.windows.WindowsTreeUI$ExpandedIcon.getIconWidth(WindowsTreeUI.java:138)
    at javax.swing.plaf.basic.BasicTreeUI.drawCentered(BasicTreeUI.java:1580)
    at javax.swing.plaf.basic.BasicTreeUI.paintExpandControl(BasicTreeUI.java:1464)
    at javax.swing.plaf.basic.BasicTreeUI.paint(BasicTreeUI.java:1206)
    at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
    at javax.swing.JComponent.paintComponent(JComponent.java:763)
    at javax.swing.JComponent.paint(JComponent.java:1027)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5122)
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:285)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1128)
    at javax.swing.JComponent._paintImmediately(JComponent.java:5070)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4880)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:723)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:679)
    at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:659)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
    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)

我不知道为什么会出现这个问题。 注意:我正在使用Windows外观。

UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

运行在Windows 7下的Java 1.6_22。


4
你能否发布你的代码?没有代码很难理解发生了什么。 - Vivin Paliath
2
我不认为问题出在库本身。你介意分享一下你是如何扫描目录中的图像的吗?我感觉输入有问题。(目录中的图像列表) - uncaught_exceptions
1
实际上,我很可能相信这是Windows PL&F的问题。提供一个触发问题的最小代码示例会很有帮助。可能它是相当机器特定的。 - Tom Hawtin - tackline
10
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); // 不好,不好, 不好 UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); // 好,好, - 您的版本只能在Windows上运行,而且Mac和Unix用户也不会想在他们的桌面上看到Windows PLAF。至于“发布代码”的建议 - 我不赞成那样做。相反,请发布一个SSCCE(http://pscode.org/sscce.html)。此外,我的猜测是代码在EDT之外执行了一些操作,这些操作应该在**EDT上执行**。 - Andrew Thompson
2
@Lucass 当一个JFrame(或JApplet)已经可见时,可以更改PLAF。只需要调用SwingUtilities.updateComponentTreeUI(Component)来确保组件树得到调整即可。 - Andrew Thompson
显示剩余4条评论
1个回答

35

试试这个:

//Set the look and feel to users OS LaF.
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (UnsupportedLookAndFeelException e) {
        e.printStackTrace();
    }

1
//将外观设置为Windows风格。 不,它在Mac或*nix操作系统上无法实现。 - Andrew Thompson
1
哇,我太喜欢了。在Windows上看起来超赞的。 - Nicholas DiPiazza
如果这个答案对您有帮助,请考虑给它投票。 - Afra
6
为什么不使用catch (Exception e) - wchargin
2
WChargin:try catch块可能是由IDE(eclipse的行为类似)单独生成的。 - Buffalo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接