我有一个带 Nimbus l& f 的Swing应用程序。有时我得到了这个异常,但我不知道它在哪里被触发以及如何避免它,因为所有源都来自跟踪堆栈中的Java库类。这是 Java问题还是我的问题?
有关我系统的一些信息:
avaVersion = 1.8.0_20
osName = Linux
osVersion = 3.15.10-201.fc20.x86_64
异常消息:
java.lang.ClassCastException: java.awt.Font cannot be cast to javax.swing.Painter
javax.swing.plaf.nimbus.NimbusStyle.getBackgroundPainter(NimbusStyle.java:708)
javax.swing.plaf.nimbus.SynthPainterImpl.paintBackground(SynthPainterImpl.java:99)
javax.swing.plaf.nimbus.SynthPainterImpl.paintPanelBackground(SynthPainterImpl.java:957)
javax.swing.plaf.synth.SynthPanelUI.update(SynthPanelUI.java:154)
javax.swing.JComponent.paintComponent(JComponent.java:777)
javax.swing.JComponent.paint(JComponent.java:1053)
javax.swing.JComponent.paintToOffscreen(JComponent.java:5223)
javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:290)
javax.swing.RepaintManager.paint(RepaintManager.java:1265)
javax.swing.JComponent._paintImmediately(JComponent.java:5171)
javax.swing.JComponent.paintImmediately(JComponent.java:4982)
javax.swing.RepaintManager$4.run(RepaintManager.java:824)
javax.swing.RepaintManager$4.run(RepaintManager.java:807)
java.security.AccessController.doPrivileged(Native Method)
java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:807)
javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:782)
javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:731)
javax.swing.RepaintManager.access$1300(RepaintManager.java:64)
javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1720)
java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
java.awt.EventQueue.access$400(EventQueue.java:97)
java.awt.EventQueue$3.run(EventQueue.java:697)
java.awt.EventQueue$3.run(EventQueue.java:691)
java.security.AccessController.doPrivileged(Native Method)
java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
java.awt.Font cannot be cast to javax.swing.Painter
修改
如果它是一致性并且经常发生,我可能能够弄明白。
我也不可能尝试将Font强制转换为Painter。
EDIT2:
这里复制了完整的异常堆栈。
EDIT3
应用程序GUI部分在SwingUtilities.invokeAndWait()中启动。
我以前也经常使用我的Win7机器但是从来没有在Win7上使用过。此应用程序已存在1年。
答案 0 :(得分:4)
您从Swing GUI中抛出了间歇性异常 高度 表明这是一个并发/线程问题。您是否正在Swing event dispatch thread上启动GUI?如果没有,请务必这样做,特别是对于一些Look&像Nimbus这样的感觉。换句话说 - 使用SwingUtilities.invokeLater(...)
在Runnable中创建GUI并将其队列到Swing事件队列中。
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
// create your Swing GUI and set the L&F here
});
}
如果这不是问题,那么仍然可以使用其中一种引用here的方法来寻找其他Swing线程问题。
有关同一问题,请参阅this bug report。它被关闭为一个非问题"这是因为:
这绝对是一个多线程问题。
同样,我现在可以放心地说你的是一个线程问题,解决它的方法是通过你的代码找出你的代码违反Swing的线程规则,因为大多数情况下它是。如果您需要我们的帮助,那么您必须向我们展示您的相关代码,即可能违反Swing线程规则的代码。如果您不能显示代码,我们无法提供具体的帮助。