调用JTabbedPane.removeAll()后,JTabbedPane仍然有x个选项卡?在关闭的选项卡的条款

tabbedPane.remove(index) 

tabbedPane.removeAll() 

都工作得不错:

调用JTabbedPane.removeAll()后,JTabbedPane仍然有x个选项卡?在关闭的选项卡的条款</p> <pre><code>tabbedPane.remove(index) </code></pre> <p>和</p> <pre><code>tabbedPane.removeAll() </code></pre> <p>都工作得不错:

问题描述:

在我JTabbedPane,我在两种不同的方式去除标签。但是,我在我的TabbedPane上有一个更改监听器,它将回调到另一个模块以报告选项卡更改。这是问题所在。调用JTabbedPane.removeAll()后,JTabbedPane仍然有x个选项卡?在关闭的选项卡的条款</p> <pre><code>tabbedPane.remove(index) </code></pre> <p>和</p> <pre><code>tabbedPane.removeAll() </code></pre> <p>都工作得不错:

当使用remove(index)添加和删除选项卡时,stateChanged()方法中的源TabbedPane在检查tabbedPane.getTabCount()时包含正确数量的选项卡。

但是,当在tabbedPane.removeAll()之后呼叫tabbedPane.getTabCount()时,计数仍然是在removeAll()之前立即出现的计数。

有没有人有任何建议?

看完源代码后,我看到发生了什么。

JTabbedPane火灾ChangeEvents当选定的选项卡更改。但要删除所有选项卡,它首先将所选选项卡设置为-1,然后,然后删除所有选项卡。因此,当ChangeListener捕捉到事件时,所有选项卡仍然存在。

如果您想知道任何时候的标签数量,恐怕您必须自己遍历标签并逐个删除它们。

while (myTabbedPane.getTabCount() > 0) 
    myTabbedPane.remove(0); 
+0

啊,我现在看到了。谢谢你的答案。非常感激。 – thedude19 2009-06-18 16:36:09

寻找一个JTabbedPane代码(版本6)两个代码都经过removeTabAt,这应该减少计数。它可能会为每个选项卡启动一个事件,但是,这意味着第一个事件的getTabCount()应该比removeAll()之前少了一个。

您确定要致电getTabCount()吗?如果您手动删除所有选项卡(结尾),会发生什么情况?

这里有一个测试用例可以帮助揭示问题。

import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

import junit.framework.TestCase; 

public class JTabbedPaneTest extends TestCase { 
    private JTabbedPane  pane; 
    private int    count = 0; 

    protected void setUp() throws Exception { 
     pane = new JTabbedPane(); 
     ChangeListener listener = new ChangeListener() { 
      public void stateChanged(ChangeEvent e) { 
       JTabbedPane pane = (JTabbedPane)e.getSource(); 
       int before = count; 
       count = pane.getTabCount(); 
       System.out.println(String.format("%s --> %s", before, count)); 
      } 
     }; 
     pane.addChangeListener(listener); 
     JPanel panel1 = new JPanel(); 
     JPanel panel2 = new JPanel(); 
     pane.add(panel1); 
     pane.add(panel2); 
    } 

    public void testOne() throws Exception { 
     assertEquals(1, count); // I actually expect 2 
     assertEquals(2, pane.getTabCount()); 
     pane.remove(0); 
     pane.remove(0); 
     assertEquals(0, count); 
     assertEquals(0, pane.getTabCount()); 
    } 

    public void testMany() throws Exception { 
     assertEquals(1, count); // I actually expect 2 
     assertEquals(2, pane.getTabCount()); 
     pane.removeAll(); 
     assertEquals(2, count); // I actually expect 0 
     assertEquals(0, pane.getTabCount()); 
    } 
} 

我认为有一个同步问题正在进行;输出是:

0 --> 1 
1 --> 1 
1 --> 0 
0 --> 1 
1 --> 2 

看起来好像有些更改事件正在丢失。

更新:留下这个地方为后代,但它是错的;因为MMyers指出事件只有在选择改变时才会发生。

+1

更改事件在选择更改时被调用,而不是在选项卡被删除时调用。 removeAll()开始它的实现,将选择更改为-1 – akf 2009-06-18 16:15:53

+0

我保持计数:你现在是#15在SO上拼错我的名字。在你去的名单上! ;) – 2009-06-18 16:28:12

+0

对不起!固定。我最深的歉意。 – 2009-06-18 16:32:09

尝试调用validaterevalidate

在这里你去;使用ContainerListener代替:

import java.awt.event.ContainerEvent; 
import java.awt.event.ContainerListener; 

import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 

import junit.framework.TestCase; 

public class JTabbedPaneTest extends TestCase { 
    private JTabbedPane pane; 
    private int   count = 0; 

    protected void setUp() throws Exception { 
     pane = new JTabbedPane(); 
     ContainerListener containerListener = new ContainerListener() { 
      public void componentAdded(ContainerEvent e) { 
       count++; 
      } 

      public void componentRemoved(ContainerEvent e) { 
       count--; 
      } 
     }; 
     pane.addContainerListener(containerListener); 
     JPanel panel1 = new JPanel(); 
     JPanel panel2 = new JPanel(); 
     pane.add(panel1); 
     pane.add(panel2); 
    } 

    public void testOne() throws Exception { 
     assertEquals(2, count); 
     assertEquals(2, pane.getTabCount()); 
     pane.remove(0); 
     pane.remove(0); 
     assertEquals(0, count); 
     assertEquals(0, pane.getTabCount()); 
    } 

    public void testMany() throws Exception { 
     assertEquals(2, count); 
     assertEquals(2, pane.getTabCount()); 
     pane.removeAll(); 
     assertEquals(0, count); 
     assertEquals(0, pane.getTabCount()); 
    } 
}