BasicTabbedPaneUI.tabPane变为null - 可能导致这种情况的原因以及如何调试它?

时间:2015-02-27 14:32:18

标签: java swing jtabbedpane

为了更好的可读性,我已经移动了一些在类中生成GUI的代码。不幸的是,我不得不在某处犯错,因为现在我收到了这个错误:

  

线程中的异常" AWT-EventQueue-0" java.lang.NullPointerException     在   javax.swing.plaf.basic.BasicTabbedPaneUI$ScrollableTabSupport.updateView(BasicTabbedPaneUI.java3351

这一行发生在javax/swing/plaf/basic/BasicTabbedPaneUI.java

       private void updateView() {
ERROR HERE: int tabPlacement = tabPane.getTabPlacement();
            int tabCount = tabPane.getTabCount();

这个类中有一个方法可以将tabPane设置为null,但我决定不调用它:

public void uninstallUI(JComponent c) {
    uninstallKeyboardActions();
    uninstallListeners();
    uninstallDefaults();
    uninstallComponents();
    c.setLayout(null);

    this.tabPane = null;
}

我使用TabbedWindow类创建选项卡式GUI:

public final JTabbedPane container;
  public TabbedWindow() {
    container = new JTabbedPane();
    container.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
    //More code but nothing with container
  }

然后我将它附加到主JPane:

public void createTabs(Container pane) {
    pane.setLayout(new GridLayout(1, 1));
    System.out.println("Creating tabbed window.");
    TabbedWindow win = new TabbedWindow();
    //Inbetween, I append some JFrames to the win.container
    //Adding to main pane:
    pane.add(win.container);
    System.out.println("Done.");

我现在的问题是:

  1. 在java库中可能导致此问题的原因是什么?为什么它不会引发更多有用的例外?
  2. 如何调试此问题并找出错误?

1 个答案:

答案 0 :(得分:0)

我无法确定真正的原因,但uninstallUI已被调用,因为我在添加其他元素之前使用了container.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);

因为我坦率地不明白整个事情是如何运作的所以我决定采取安全的方式:

  public void close() {
    container.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
    closed = true;
  }

在调用close之后,不再有任何东西可以添加到GUI中。