بعد استدعاء JTabbedPane.removeAll ()، وJTabbedPane لا يزال لديه عدد العاشر من علامات التبويب؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

في بلدي JTabbedPane، وأنا إزالة علامات التبويب في 2 طرق مختلفة:

tabbedPane.remove(index)

و

tabbedPane.removeAll()

وكلا تعمل بشكل جيد من حيث إغلاق علامات التبويب. ومع ذلك، لدي المستمع تغيير على بلدي TabbedPane أن يدعو إلى وحدة أخرى للإبلاغ عن التغييرات التبويب. هذا هو أين تكمن المشكلة.

عند إضافة وإزالة علامات التبويب باستخدام remove(index)، وTabbedPane مصدر في طريقة 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());
    }
}

وتبحث عن رمز 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