调用JTabbedPane.removeAll()后,JTabbedPane仍然有x个选项卡?在关闭的选项卡的条款 tabbedPane.remove(index)
tabbedPane.remove(index)
和
tabbedPane.removeAll()
都工作得不错:
在我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);
寻找一个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指出事件只有在选择改变时才会发生。
更改事件在选择更改时被调用,而不是在选项卡被删除时调用。 removeAll()开始它的实现,将选择更改为-1 – akf 2009-06-18 16:15:53
我保持计数:你现在是#15在SO上拼错我的名字。在你去的名单上! ;) – 2009-06-18 16:28:12
对不起!固定。我最深的歉意。 – 2009-06-18 16:32:09
在这里你去;使用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());
}
}
啊,我现在看到了。谢谢你的答案。非常感激。 – thedude19 2009-06-18 16:36:09