代码之家  ›  专栏  ›  技术社区  ›  thedude19

调用jtabedpane.removeall()后,jtabedpane仍有x个选项卡?

  •  2
  • thedude19  · 技术社区  · 17 年前

    在我的 JTabbedPane ,我以两种不同的方式删除选项卡:

    tabbedPane.remove(index)
    

    tabbedPane.removeAll()
    

    在关闭选项卡方面,两者都可以正常工作。但是,我的 TabbedPane 它调用另一个模块来报告选项卡更改。这就是问题所在。

    添加和删除选项卡时使用 remove(index) ,中的源选项卡窗格 stateChanged() 方法在检查时包含正确数目的制表符 tabbedPane.getTabCount() .

    但是,打电话时 选项卡窗格.gettabCount()) 之后 tabbedPane.removeAll() ,计数仍然是在 removeAll() .

    有人有什么建议吗?

    5 回复  |  直到 10 年前
        1
  •  9
  •   Michael Myers KitsuneYMG    17 年前

    在看了源代码之后,我看到了正在发生的事情。

    JTabbedPane 火灾 ChangeEvents 当所选选项卡更改时。但要删除所有选项卡,它首先将所选选项卡设置为-1,然后 然后 删除所有选项卡。所以当 ChangeListener 捕获事件,所有选项卡仍在那里。

    如果您一直想知道选项卡的数量,恐怕您必须自己迭代这些选项卡并逐个删除它们。

    while (myTabbedPane.getTabCount() > 0)
        myTabbedPane.remove(0);
    
        2
  •  3
  •   Carl Manaster    17 年前

    现在,使用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());
        }
    }
    
        3
  •  0
  •   Kathy Van Stone    17 年前

    看一看 JTabbedPane 代码(版本6)两个代码都经过 removeTabAt ,这将减少计数。但是,它可能会为每个选项卡触发一个事件,这意味着第一个事件应该具有 getTabCount() 比之前的计数少一个 removeAll() .

    你确定 GETTABCONTUTH() 打电话?如果手动(从末尾)删除所有选项卡,会发生什么情况?

        4
  •  0
  •   Pierre    17 年前

    试着打电话 validate revalidate

        5
  •  0
  •   Carl Manaster    17 年前

    下面是一个有助于暴露问题的测试用例。

    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指出的,事件仅在选择更改时触发。