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

Cuando setTheme() se llama, esto hace que esto ocurra repetidamente (presumiblemente para cada componente):validate() tree throws NullPointerException en L & F change?

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) 

comentando la línea 'setTabComponentAt (getTabCount() - 1, panel);' impide que se ejecute la excepción (pero esto, por supuesto, rompe la UI), al igual que la anulación de updateUI() en la clase TabbedArea y envolviendo super.updateUI() en SwingUtilities.invokeLater (..).

Esto parece ser similar a un bug que el equipo jEdit tuvo con uno de sus complementos al actualizar el L & F. Sin embargo, su solution era simplemente para no actualizar el aspecto de la aplicación y se siente durante el tiempo de ejecución y confiar en una reiniciar para hacerlo.

¿Alguien tiene alguna idea de cómo se puede resolver esto sin necesidad de un reinicio para cambiar la apariencia?

+0

Swing no es seguro para subprocesos, por lo que debe cambiar la UI en el subproceso de envío de eventos. ¿Arregla la implementación de 'setTheme' en' SwingUtilities.invokeLater (...) 'soluciona el problema? –

+0

¿Qué JRE estás usando y qué L & F estás usando? – wolfcastle

Respuesta

1

En cuanto a la fuente para Java 6 encontré la línea 263 de BasicTabbedPaneUI es una instrucción de retorno:

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

La única cosa que puede hacer que su NPE es que la referencia tabPane es nulo. Sin más información, todo lo que puedo adivinar es que eliminó un componente de pestaña sin quitar la pestaña correspondiente.

Cuestiones relacionadas