2010-11-18 10 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); 
    } 
    } 
} 

setTheme() कहा जाता है, इस का कारण बनता है जब यह (प्रत्येक घटक के लिए शायद) बार-बार होने के लिए: लाइन बाहर टिप्पणी करतेमान्य() पेड़ एल एंड एफ परिवर्तन पर NullPointerException फेंकता है?

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() को लपेटता है।

यह एक bug कि jEdit टीम अपने प्लग इन में से एक के साथ किया था एल & एफ अपडेट करने के दौरान हालांकि के समान प्रतीत होता है, उनके solution आवेदन के लुक को अद्यतन नहीं तथा रनटाइम के दौरान लग रहा है और एक पर भरोसा करने के लिए बस था इसे करने के लिए पुनरारंभ करें।

किसी के पास कोई विचार है कि इसे कैसे दिखाना और महसूस करने के लिए पुनरारंभ करने की आवश्यकता के बिना हल किया जा सकता है?

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

केवल एक चीज पैदा कर सकता है कि आपके एनपीई कि tabPane संदर्भ मान शून्य होगा:

+0

स्विंग थ्रेड-सुरक्षित नहीं है, इसलिए आपको इवेंट डिस्पैच थ्रेड में UI को बदलना होगा। 'SetTheme' के कार्यान्वयन को 'SwingUtilities.invokeLater (...)' में हल करना क्या समस्या को हल करता है? –

+0

आप किस जेआरई का उपयोग कर रहे हैं, और आप एल एंड एफ क्या उपयोग कर रहे हैं? – wolfcastle

उत्तर

1

स्रोत जावा 6 के लिए मैं BasicTabbedPaneUI की लाइन 263 पाया को देखते हुए एक वापसी बयान है। अधिक जानकारी के बिना मैं अनुमान लगा सकता हूं कि आपने संबंधित टैब को हटाए बिना एक टैब घटक हटा दिया है।

संबंधित मुद्दे