NullPointerException в javax.swing.plaf.synth.SynthContext.getPainter
Программа на Java Swing, над которой я работаю, получает исключение ниже. Это происходит в случайное время и далеко не воспроизводимо. Кажется, что это обычно не вызывает каких-либо проблем, кроме случаев, когда вовремя события не инициируются, но обычно даже после этого исключения все работает нормально. Кажется, нет последовательности в том, что происходит. У кого-нибудь есть совет? Я должен упомянуть, что мы используем нимб LAF.
java.lang.NullPointerException
at javax.swing.plaf.synth.SynthContext.getPainter(SynthContext.java:181)
at javax.swing.plaf.synth.SynthPanelUI.update(SynthPanelUI.java:95)
at javax.swing.JComponent.paintComponent(JComponent.java:752)
at javax.swing.JComponent.paint(JComponent.java:1029)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at javax.swing.JComponent.paintChildren(JComponent.java:862)
at javax.swing.JComponent.paint(JComponent.java:1038)
at org.jdesktop.jxlayer.JXLayer.paint(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)
at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:785)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
3 ответа
Иногда я получаю ту же ошибку при вызове:
JComponent.updateUI()
используя Nimbus Look & Feel. В моем случае такой вызов не был необходим, поэтому я удалил строку.
Это довольно популярная ошибка, если вы искали в Google.
Один из сайтов предлагает это:
заменить линию
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
с:
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
Я получил эту ошибку после попытки перекрасить компонент Swing с помощью следующего метода:
SwingUtilities.updateComponentTreeUI(COMPONENT);
где COMPONENT
является компонентом качелей, который необходимо перекрасить.
Я наконец решил эту проблему, заменив приведенный выше код
COMPONENT.validate();
COMPONENT.repaint();
У меня была такая же проблема, и я смог ее исправить, у меня есть два предложения, если вы используете SwingWorkers.
1) В методе doInBackground вашего работника попробуйте перехватить любые исключения Runtime или uncaught, чтобы вы могли убедиться, что ваш метод не завершается, прежде чем вы об этом думаете.
2) Убедитесь, что вы не обновляете какой-либо компонент Swing за пределами событий изменения свойств рабочего. Помните, что все компоненты Swing должны обновляться только в потоке событий, а не в потоке работника.
Надеюсь это поможет.