删除jtabbedpane的最后一个标签

时间:2013-01-05 15:45:27

标签: java swing jtabbedpane

我有点困惑,因为我无法删除JTabbedPane的最后一个Tab。 我读了这两个问题: first question second question。但它对我没有帮助。 这就是我的代码的样子:

public void updateTabbedPane()
{
    // Remove the MouseListener
    tabbedPane.removeMouseListener(tabbedPaneMouseListener);

    // Remove all Tabs
    while (tabbedPane.getTabCount() > 0)
    {
        tabbedPane.remove(0);
    }

    // Sort the ArrayList
    Collections.sort(arrayList);

    // Add all Element to the JTabbedPane
    for (int i = 0; i < arrayList.size(); i++)
    {
        tabbedPane.addTab(arrayList.get(i).getName(),
                new JScrollPane(...);
    }

    // Add the MouseListiner to the JTabbedPane again
    tabbedPane.addMouseListener(tabbedPaneMouseListener);
}

如果在列表中添加/删除对象,我将使用此方法添加/删除选项卡。我也对ArrayList进行排序,因为我希望按升序排列选项卡。

正如在两个问题的答案中所说,我在删除Tabs之前删除了MouseListener,但最后一个Tab仍然可见。我也试过setVisible(),removeAll()。

欢迎任何帮助!

2 个答案:

答案 0 :(得分:2)

好像你可能没有在Swing's GUI thread中运行此代码。是在传递给Runnable的{​​{1}}内吗?如果是这种情况,SwingUtilities.invokeLater(...)应该有用。

此外,您不应直接在组件上使用removeAll - 您应该在setVisible上使用setSelectedIndexsetSelectedComponent

此外,当标签的总顺序没有变化时,删除所有选项卡并为除了其中一个之外的所有标签再次创建新的JTabbedPane似乎非常低效。也许您应该按排序顺序维护一个列表,例如JScrollPane,只需在有更新时插入并删除相应索引处的单个选项卡。

答案 1 :(得分:2)

感谢Andrew Thompson和Andrew Mao的建议。

@Mao:1。)我正在使用Swing GUI Thread。 2.)setVisible只是我解决问题的最后一个想法:-P 3.)当然这样会更高效,但在这种情况下我有点脏,因为不会同时超过三个标签。但我想我以后会改变它。

@Thompson:由于SSCCE,我创建了一个仅针对我的问题的项目(您可以在下面看到),以显示我的问题。但是这个项目有效,所以我将测试项目的小步骤与我的真实项目进行了比较,发现了一点错误。

我的问题是我在删除ArrayList的对象之前更新了标签,因此GUI仍然将删除的对象显示为标签。

对于对我的JTabbedPane测试项目感兴趣的任何人:

import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class TabbedTest extends JFrame {

    private JTabbedPane tabbedPane = null;
    private MouseListener tabbedPaneMouseListener = null;
    private ArrayList<String> nameOfTab = new ArrayList<String>();
    private static int counter = 1;

    public TabbedTest() {
        setSize(500, 500);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setLayout(new GridLayout(0, 1));
        JPanel buttonPanel = new JPanel();

        JButton addButton = new JButton("add");
        addButton.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent evt) {
                addElementToArrayList();
            }
        });
        JButton removeButton = new JButton("remove");
        removeButton.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent evt) {
                removeElementFromArrayList();
            }
        });

        tabbedPane = new JTabbedPane();
        tabbedPaneMouseListener = (new MouseAdapter() {

            public void mouseClicked(MouseEvent e) {
                if (SwingUtilities.isLeftMouseButton(e)) {
                    if (e.getClickCount() == 1) {
                        System.out.println("Do Something");
                    }
                }
            }
        });
        tabbedPane.addMouseListener(tabbedPaneMouseListener);

        buttonPanel.add(addButton);
        buttonPanel.add(removeButton);
        add(buttonPanel);
        this.add(tabbedPane);
    }

    private void addElementToArrayList() {
        nameOfTab.add("" + counter++ + ". element");
        updateTabbedPane();
    }

    private void removeElementFromArrayList() {
        if (nameOfTab.size() > 0) {
            nameOfTab.remove(0);
        }
        updateTabbedPane();
    }

    public void updateTabbedPane() {
        tabbedPane.removeMouseListener(tabbedPaneMouseListener);
        while (tabbedPane.getTabCount() > 0) {
            tabbedPane.remove(0);
        }
        for (int i = 0; i < nameOfTab.size(); i++) {
            tabbedPane.addTab(nameOfTab.get(i), new JLabel(nameOfTab.get(i)));
        }
        tabbedPane.addMouseListener(tabbedPaneMouseListener);
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new TabbedTest().setVisible(true);
            }
        });
    }
}