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

Khi setTheme() được gọi, điều này gây ra điều này xảy ra nhiều lần (có lẽ cho mỗi thành phần):validate() cây ném NullPointerException vào thay đổi 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) 

Bình luận ra dòng 'setTabComponentAt (getTabCount() - 1, bảng điều khiển);' dừng ngoại lệ khỏi bị ném (nhưng điều này, tất nhiên, phá vỡ giao diện người dùng), cũng như ghi đè updateUI() trong lớp TabbedArea và gói super.updateUI() trong SwingUtilities.invokeLater (..).

này dường như là tương tự như một bug mà nhóm jEdit đã có với một trong các plugin của họ khi cập nhật L & F. Tuy nhiên, họ solution chỉ đơn giản là để không cập nhật cái nhìn của ứng dụng và cảm thấy trong thời gian chạy và phải dựa vào một khởi động lại để làm điều đó.

Bất kỳ ai có bất kỳ ý tưởng nào về cách giải quyết vấn đề này mà không cần khởi động lại để thay đổi giao diện?

+0

Swing không an toàn chỉ vì vậy bạn phải thay đổi giao diện người dùng trong Chủ đề công văn sự kiện. Việc thực hiện gói 'setTheme' thành' SwingUtilities.invokeLater (...) 'có khắc phục được sự cố không? –

+0

Bạn đang sử dụng JRE nào và bạn đang sử dụng L & F nào? – wolfcastle

Trả lời

1

Nhìn vào nguồn cho Java 6 Tôi thấy dòng 263 của BasicTabbedPaneUI là một tuyên bố trở lại:

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

Điều duy nhất có thể gây NPE của bạn là tabPane tham chiếu là null. Nếu không có thêm thông tin, tất cả những gì tôi có thể đoán là bạn đã xóa một thành phần tab mà không xóa tab tương ứng.

Các vấn đề liên quan