2015-04-14 41 views
0

我有我在其中显示JTree的Jframe。由于我有大量的节点被添加,我所做的是创建4个线程,继续添加节点到树。Swing UI刷新:后台线程打印异常

使新添加的节点在UI上可见。我每10秒使用一次重新加载帧,

SwingUtilities.updateComponentTreeUI(frame); 

我的帧被重新加载并且新添加的节点现在可见。但是有后台线程在我的控制台上打印异常。虽然它不妨碍我的UI输出。但是,我可以知道原因,以下例外情况的原因以及如何解决此问题

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at javax.swing.plaf.basic.BasicScrollBarUI.layoutHScrollbar(BasicScrollBarUI.java:731) 
    at javax.swing.plaf.basic.BasicScrollBarUI.layoutContainer(BasicScrollBarUI.java:833) 
    at java.awt.Container.layout(Container.java:1421) 




Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at javax.swing.plaf.basic.BasicScrollPaneUI.paint(BasicScrollPaneUI.java:90) 
    at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143) 
    at javax.swing.JComponent.paintComponent(JComponent.java:752) 
    at javax.swing.JComponent.paint(JComponent.java:1029) 



Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at javax.swing.plaf.basic.BasicScrollBarUI.layoutVScrollbar(BasicScrollBarUI.java:638) 
    at javax.swing.plaf.basic.BasicScrollBarUI.layoutContainer(BasicScrollBarUI.java:829) 
    at java.awt.Container.layout(Container.java:1421) 
    at java.awt.Container.doLayout(Container.java:1410) 
    at java.awt.Container.validateTree(Container.java:1507) 
    at java.awt.Container.validateTree(Container.java:1513) 

另外,异常堆栈跟踪更改如上所述。我无法弄清楚什么是可能的原因。我还同步了代码,以便在刷新帧时不添加新节点。但它没有帮助。

请告诉我在这种情况下应该怎么做。

谢谢

回答

1

摆动不是线程安全的。对Swing UI组件的所有修改都需要从事件派发线程执行。您应该删除已经实现的四个线程,并从主线程执行所有操作。

+0

我试图通过main()来执行它。另外,我尝试使用SwingUtilities.invokeLater()。但异常似乎来了 –

+0

谢谢!谢谢!!为评论。它实际上帮助我解决了我的问题。 –

+0

SwingUtilities.invokeLater(新的Runnable(){ \t \t \t \t \t公共无效的run(){ \t \t \t \t \t \t SwingUtilities.updateComponentTreeUI(帧); \t \t \t \t \t \t \t \t \t \t \t }} \t \t \t \t); –