Java validate()树在L&;上抛出NullPointerException;换零钱?

Java validate()树在L&;上抛出NullPointerException;换零钱?,java,nullpointerexception,jtabbedpane,Java,Nullpointerexception,Jtabbedpane,调用setTheme()时,这会导致重复发生(可能针对每个组件): 注释掉行“setTabComponentAt(getTabCount()-1,panel);”阻止抛出异常(但这当然会破坏UI),正如在TabbedArea类中重写updateUI()和在SwingUtilities.invokeLater(..)中包装super.updateUI()一样 这似乎类似于jEdit团队在更新L&F时使用的一个插件。然而,他们的目的只是在运行时不更新应用程序的外观,而是依靠重启来完成 有人知道如何解

调用setTheme()时,这会导致重复发生(可能针对每个组件):

注释掉行“setTabComponentAt(getTabCount()-1,panel);”阻止抛出异常(但这当然会破坏UI),正如在TabbedArea类中重写updateUI()和在SwingUtilities.invokeLater(..)中包装super.updateUI()一样

这似乎类似于jEdit团队在更新L&F时使用的一个插件。然而,他们的目的只是在运行时不更新应用程序的外观,而是依靠重启来完成


有人知道如何解决这个问题而不需要重新启动来改变外观吗?

查看Java 6的源代码,我发现BasicTabbedPaneUI的第263行是一个返回语句:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
 at javax.swing.plaf.basic.BasicTabbedPaneUI.scrollableTabLayoutEnabled(BasicTabbedPaneUI.java:263)
 at javax.swing.plaf.basic.BasicTabbedPaneUI.access$400(BasicTabbedPaneUI.java:54)
 at javax.swing.plaf.basic.BasicTabbedPaneUI$TabContainer.doLayout(BasicTabbedPaneUI.java:3850)
 at java.awt.Container.validateTree(Container.java:1568)
 at java.awt.Container.validateTree(Container.java:1575)
 at java.awt.Container.validateTree(Container.java:1575)
 at java.awt.Container.validateTree(Container.java:1575)
 at java.awt.Container.validateTree(Container.java:1575)
 at java.awt.Container.validate(Container.java:1540)
 at javax.swing.SwingUtilities.updateComponentTreeUI(SwingUtilities.java:1227)
 at flextrade.tca.ui.LnFManager.setTheme(LnFManager.java:113)
 at flextrade.tca.ui.ToolBar$15.actionPerformed(ToolBar.java:803)
 at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012)
 at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335)
 at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404)
 at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:308)
 at javax.swing.AbstractButton.doClick(AbstractButton.java:374)
 at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:829)
 at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:873)
 at java.awt.Component.processMouseEvent(Component.java:6108)
 at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
 at java.awt.Component.processEvent(Component.java:5873)
 at java.awt.Container.processEvent(Container.java:2105)
 at java.awt.Component.dispatchEventImpl(Component.java:4469)
 at java.awt.Container.dispatchEventImpl(Container.java:2163)
 at java.awt.Component.dispatchEvent(Component.java:4295)
 at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4461)
 at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4125)
 at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4055)
 at java.awt.Container.dispatchEventImpl(Container.java:2149)
 at java.awt.Window.dispatchEventImpl(Window.java:2478)
 at java.awt.Component.dispatchEvent(Component.java:4295)
 at java.awt.EventQueue.dispatchEvent(EventQueue.java:604)
 at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
 at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
 at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

唯一可能导致NPE的是tabPane引用为null。如果没有更多信息,我只能猜测您已经删除了选项卡组件,而没有删除相应的选项卡。

Swing不是线程安全的,因此您必须在事件分派线程中更改UI。将
setTheme
的实现包装到
SwingUtilities.invokeLater(…)
中是否解决了这个问题?您使用的是什么JRE,使用的是什么L&F?
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
 at javax.swing.plaf.basic.BasicTabbedPaneUI.scrollableTabLayoutEnabled(BasicTabbedPaneUI.java:263)
 at javax.swing.plaf.basic.BasicTabbedPaneUI.access$400(BasicTabbedPaneUI.java:54)
 at javax.swing.plaf.basic.BasicTabbedPaneUI$TabContainer.doLayout(BasicTabbedPaneUI.java:3850)
 at java.awt.Container.validateTree(Container.java:1568)
 at java.awt.Container.validateTree(Container.java:1575)
 at java.awt.Container.validateTree(Container.java:1575)
 at java.awt.Container.validateTree(Container.java:1575)
 at java.awt.Container.validateTree(Container.java:1575)
 at java.awt.Container.validate(Container.java:1540)
 at javax.swing.SwingUtilities.updateComponentTreeUI(SwingUtilities.java:1227)
 at flextrade.tca.ui.LnFManager.setTheme(LnFManager.java:113)
 at flextrade.tca.ui.ToolBar$15.actionPerformed(ToolBar.java:803)
 at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012)
 at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335)
 at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404)
 at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:308)
 at javax.swing.AbstractButton.doClick(AbstractButton.java:374)
 at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:829)
 at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:873)
 at java.awt.Component.processMouseEvent(Component.java:6108)
 at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
 at java.awt.Component.processEvent(Component.java:5873)
 at java.awt.Container.processEvent(Container.java:2105)
 at java.awt.Component.dispatchEventImpl(Component.java:4469)
 at java.awt.Container.dispatchEventImpl(Container.java:2163)
 at java.awt.Component.dispatchEvent(Component.java:4295)
 at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4461)
 at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4125)
 at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4055)
 at java.awt.Container.dispatchEventImpl(Container.java:2149)
 at java.awt.Window.dispatchEventImpl(Window.java:2478)
 at java.awt.Component.dispatchEvent(Component.java:4295)
 at java.awt.EventQueue.dispatchEvent(EventQueue.java:604)
 at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
 at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
 at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
        /* In an attempt to preserve backward compatibility for programs
         * which have extended BasicTabbedPaneUI to do their own layout, the
         * UI uses the installed layoutManager (and not tabLayoutPolicy) to
         * determine if scrollTabLayout is enabled.
         */
        private boolean scrollableTabLayoutEnabled() {
            return (tabPane.getLayout() instanceof TabbedPaneScrollLayout);
        }