2015-12-24 6 views
-9

У меня есть приложение Swing с Nimbus l & f. Иногда я получаю это исключение, но я не знаю, где это срабатывает, и как его избежать, потому что все источники из классов библиотеки Java в стеке трассировки. Является ли это проблемой Java или моей проблемой?Как избежать этого исключения ClassCastException?

Некоторая информация о моей системе:

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 

EDIT:

Если последовательность и происходит очень часто, я могу быть в состоянии понять это.

Я также не могу попробовать бросить шрифт художнику.

EDIT2:

Полный стек исключение здесь копируется.

EDIT3

Графический интерфейс приложения часть начинается в течение SwingUtilities.invokeAndWait().

Я также использую свою машину Win7 раньше, но никогда не получаю ее на Win7. Это приложение уже существует 1 год.

+3

Опубликовать [mcve] ... – Reimeus

+3

Это исключение можно избежать, если вы не попробуете придать 'Font'' 'Painter'. – dasblinkenlight

+0

У вас есть прерывистая ошибка, которая настоятельно предлагает проблему параллелизма или потоков. Вы начинаете графический интерфейс в потоке событий Swing? Обязательно сделайте это, особенно с некоторыми Look & Feels, такими как Nimbus. Другими словами - создайте свой GUI в Runnable и очередь, которая находится в очереди событий Swing, используя 'SwingUtilities.invokeLater (...)'. –

ответ

4

Вы прерывистое исключение будучи выброшено из графического интерфейса Swing, который высоко наводят на мысль, что это проблема параллелизма/нарезании резьбы. Вы начинаете графический интерфейс на Swing event dispatch thread? Если нет, пожалуйста, обязательно сделайте это, особенно с некоторыми Посмотрите & Чувства, такие как Нимб. Другими словами - создайте свой GUI в Runnable и queue, который находится в очереди событий Swing, используя SwingUtilities.invokeLater(...).

public static void main(String[] args) { 
    SwingUtilities.invokeLater(() -> { 
     // create your Swing GUI and set the L&F here 
    }); 
} 

Если это не проблема, то по-прежнему искать другие вопросы, свинг пронизывающих, возможно, используя один из подходов привел here.


См. this bug report по тому же вопросу. Он был закрыт как «не выпуск», потому что:

Это, безусловно, проблема многопоточности.

Опять же, теперь я могу с уверенностью сказать, что ваш является проблемой нарезания резьбы, что способ решить это пройти через код и узнать, где ваш код нарушают правила поточного Свинга, потому что, безусловно, это , Если вам нужна наша помощь, то вы должны показать нам свой уместный код, то есть код, который может нарушать правила качания свинг. Если вы не будете показывать код, мы не сможем дать конкретную помощь.

+0

Качели только имеют один EDT. если ВСЕ связанные с GUI действия ограничены в EDT, это устранит эту проблему? – peterboston

+0

@peterboston: все действия GUI следует вызывать в период EDT. Все длительные действия следует вызывать в фоновом потоке. Способ выяснить, устраняет ли это проблему, проверить ее. –

Смежные вопросы