jtabbedpane.removeall ()을 호출 한 후에는 jtabbedpane에 여전히 x 수의 탭이 있습니까?
-
06-07-2019 - |
문제
내 JTabbedPane
, 나는 두 가지 방법으로 탭을 제거하고 있습니다.
tabbedPane.remove(index)
그리고
tabbedPane.removeAll()
둘 다 탭을 닫는 측면에서 잘 작동합니다. 그러나 나는 나의 변화 청취자가있다 TabbedPane
탭 변경에 대해보고하기 위해 다른 모듈로 돌아갑니다. 이것은 문제가있는 곳입니다.
사용 탭을 추가하고 제거 할 때 remove(index)
, 소스 탭의 stateChanged()
메소드는 확인할 때 올바른 탭 수를 포함합니다 tabbedPane.getTabCount()
.
그러나 전화 할 때 tabbedPane.getTabCount()
~ 후에 tabbedPane.removeAll()
, 카운트는 여전히 직전에 존재했던 카운트입니다. removeAll()
.
누구든지 제안이 있습니까?
해결책
소스 코드를 살펴본 후 무슨 일이 일어나고 있는지 알 수 있습니다.
JTabbedPane
화재 ChangeEvents
선택한 탭이 변경된 경우 그러나 모든 탭을 제거하기 위해 먼저 선택한 탭을 -1로 설정하고 그 다음에 모든 탭을 제거합니다. 그래서 ChangeListener
이벤트를 잡고 모든 탭이 여전히 있습니다.
항상 탭 수를 알고 싶다면 탭을 직접 반복하여 하나씩 제거해야합니다.
while (myTabbedPane.getTabCount() > 0)
myTabbedPane.remove(0);
다른 팁
여기 당신은 간다; 대신 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());
}
}
a 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가 지적한대로 선택이 변경 될 때만 이벤트 만 발사합니다.