1

我有点困惑,因为我无法删除我的 JTabbedPane 的最后一个选项卡。我读了这两个问题: 第一个问题第二个问题。但这对我没有帮助。这就是我的代码的样子:

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 进行了排序,因为我想让选项卡按升序排列。

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

欢迎任何帮助!

4

2 回答 2

2

看来您可能没有在Swing 的 GUI 线程中运行此代码。Runnable是在传递给的 a 里面SwingUtilities.invokeLater(...)吗?removeAll如果是这样的话,应该可以工作。

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

Moreover, removing all the tabs and creating a new JScrollPaneagain for all but one of them seems horribly inefficient when the total order of the tabs doesn't change. 也许您应该按排序顺序维护一个列表,例如 a TreeSet,并在有更新时在适当的索引处插入和删除一个选项卡。

于 2013-01-05T16:27:26.937 回答
2

感谢您对 Andrew Thompson 和 Andrew Mao 的建议。

@Mao:1.)我正在使用 Swing GUI 线程。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);
            }
        });
    }
}
于 2013-01-05T18:12:43.783 回答