これが問題を明らかにするのに役立つテストケースです。
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が指摘しているように、イベントは選択が変更されたときにのみ発生します。