簡體   English   中英

刪除jtabbedpane的最后一個標簽

[英]Remove last tab of jtabbedpane

我有點困惑,因為我無法刪除JTabbedPane的最后一個Tab。 我讀了這兩個問題: 第一個問題第二個問題 但它對我沒有幫助。 這是我的代碼的樣子:

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()。

歡迎任何幫助!

看起來您可能沒有在Swing的GUI線程中運行此代碼。 它是否在傳遞給SwingUtilities.invokeLater(...)Runnable中? 如果是這種情況, removeAll應該可以工作。

此外,您不應該直接在組件上使用setVisible - 您應該在JTabbedPane上使用setSelectedIndexsetSelectedComponent

此外,當選項卡的總順序沒有改變時,刪除所有選項卡並為除了其中一個之外的所有選項再次創建新的JScrollPane似乎非常低效。 也許您應該按排序順序維護一個列表,例如TreeSet ,只需在有更新時插入並刪除適當索引處的單個選項卡。

感謝您在Andrew Thompson和Andrew Mao的建議。

@Mao:1。)我正在使用Swing GUI Thread。 2.) setVisible只是我修復問題的最后一個想法:-P 3.)當然這樣會更高效,但在這種情況下我有點臟,因為不會有超過三個選項卡同時。 但我想我以后會改變它。

@Thompson:由於SSCCE,我為我的問題創建了一個項目(你可以在下面看到),以顯示我的問題。 但是這個項目有效,所以我將我的測試項目的小步驟與我的真實項目進行了比較,發現了一個小錯誤。

我的問題是我在刪除ArrayList的對象之前更新了選項卡,因此GUI仍然將刪除的Object顯示為選項卡。

對於對我的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);
            }
        });
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM