2010-11-18 2 views
6
public class TabbedArea extends JTabbedPane { 
    public void addArea(){ 
    add(component); 
    final JPanel panel = new JPanel(new BorderLayout()); 
    panel.add(new JLabel(title), BorderLayout.LINE_START); 
    JButton closeButton = new JButton(new CloseIcon()); 
    closeButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
     removeArea(subAreas.get(indexOfTabComponent(panel))); 
     } 
    }); 
    panel.add(closeButton, BorderLayout.LINE_END); 

    setTabComponentAt(getTabCount() - 1, panel); 
    } 
} 

public class LnFManager { 
    public void setTheme(PlasticTheme theme){ 
    for (Window window : Window.getWindows()) { 
     if (window.isDisplayable()) 
     SwingUtilities.updateComponentTreeUI(window); 
    } 
    } 
} 

그림 참고()가 호출되며,이 문제는 (아마도 각 구성 요소에 대해) 반복해서 발생시킨다 경우 :validate() 트리가 L & F 변경시 NullPointerException을 throw합니까?

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) 

을 줄 주석 처리 "setTabComponentAt (getTabCount() - 1 패널); ' (TabbedArea 클래스의 updateUI()를 오버라이드하고 SwingUtilities.invokeLater (..)에서 super.updateUI()를 래핑하는 것과 마찬가지로 예외가 던져지지 않도록합니다.

이것은 그러나 L & F.을 업데이트 할 때 jEdit과 팀이 자신의 플러그인 중 하나를 가진 bug 유사하게 나타납니다, 그들의 solution 응용 프로그램의 모양을 업데이트하고 런타임 중에 느끼고에 의존하지 단순히이었다 그것을 다시 시작합니다.

누구나 재구성을하지 않아도 모양과 느낌을 변경하지 않고도 해결할 수있는 아이디어가 있습니까? 당신의 NPE가 tabPane 참조가 null이다 일으킬 수

 /* 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); 
     } 

유일한 : 나는 BasicTabbedPaneUI의 라인 (263)을 발견 자바 6의 소스를 보면

+0

스윙은 스레드로부터 안전하지 않으므로 Event Dispatch Thread에서 UI를 변경해야합니다. 'setTheme'의 구현을 SwingUtilities.invokeLater (...)로 래핑하면 문제가 해결됩니까? –

+0

어떤 JRE를 사용하고 있으며 어떤 L & F를 사용하고 있습니까? – wolfcastle

답변

1

는 return 문이다. 더 자세한 정보가 없다면 추측 할 수있는 것은 해당 탭을 제거하지 않고 탭 구성 요소를 제거했다는 것입니다.