JTabbedPane.removeAll (), die JTabbedPane noch hat x Anzahl der Registerkarten Nach dem Aufruf?

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

  •  06-07-2019
  •  | 
  •  

Frage

In meiner JTabbedPane, ich Tabs auf 2 verschiedene Arten entfernen:

tabbedPane.remove(index)

und

tabbedPane.removeAll()

Beide arbeiten gut in Bezug auf die Tabs zu schließen. Allerdings habe ich eine Änderung Zuhörer auf meine TabbedPane, die zurück zu einem anderen Modul fordert Registerkarte Änderungen zu melden. Dies ist, wo das Problem ist.

Beim Hinzufügen und Entfernen von Registerkarten remove(index) verwenden, die Quelle TabbedPane im stateChanged() Verfahren enthält die korrekte Anzahl von Tabs bei der Überprüfung tabbedPane.getTabCount().

Wenn jedoch tabbedPane.getTabCount() nach tabbedPane.removeAll() Aufruf, ist die Anzahl noch die Zählung, die vorhanden unmittelbar vor dem removeAll() war.

Hat jemand irgendwelche Vorschläge haben?

War es hilfreich?

Lösung

Nach dem Quellcode suchen, sehe ich, was los ist.

JTabbedPane Feuer ChangeEvents, wenn die ausgewählten Registerkarte geändert wird. Aber um alle Registerkarten zu entfernen, setzt er zuerst die ausgewählten Registerkarte auf -1 und und entfernt alle Registerkarten. Also, wenn die ChangeListener das Ereignis fängt, alle Tabs sind immer noch da.

Wenn Sie die Anzahl der Registerkarten jederzeit wissen wollen, ich fürchte, Sie werden sich durch die Laschen laufen haben und entfernen Sie sie eins nach dem anderen.

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

Andere Tipps

Hier gehen Sie; Verwendung ContainerListener statt:

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());
    }
}

Mit Blick auf eine der JTabbedPane Code (Version 6) beide Codes durch removeTabAt, die die Zählung abnehmen sollte. Es wird wahrscheinlich ein Ereignis für jeden Reiter abfeuern, aber was bedeutet, dass die erste Veranstaltung den getTabCount() einen weniger als der Zählung vor dem removeAll() haben sollte.

Sind Sie sicher über den getTabCount() Anruf? Was passiert, wenn Sie alle Registerkarten (Ende) manuell entfernen?

Versuchen Sie validieren oder revalidate

Hier ist ein Testfall, der den Fehler aufzudecken hilft.

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());
    }
}

Ich denke, es ist ein Synchronisierungsproblem los; der Ausgang ist:

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

Es sieht aus, als ob einige Änderungsereignisse verloren gehen.

Aktualisieren : diese an Ort und Stelle für die Nachwelt zu verlassen, aber es ist falsch; wie mmyers die Ereignisse weist darauf hin, nur ausgelöst, wenn sich die Auswahl ändert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top