jtabbedpane.removeall ()을 호출 한 후에는 jtabbedpane에 여전히 x 수의 탭이 있습니까?

StackOverflow https://stackoverflow.com/questions/1013479

  •  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가 지적한대로 선택이 변경 될 때만 이벤트 만 발사합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top