1

JTabbedPane の最後のタブを削除できないため、少し混乱しています。この 2 つの質問を読みました。 最初の質問2 番目の質問です。しかし、それは私には役に立ちませんでした。これは私のコードがどのように見えるかです:

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 もソートします。

2つの質問の回答で述べたように、タブを削除する前にMouseListenerを削除しましたが、最後のタブは最後に表示されたままです。setVisible()、removeAll() も試しました。

どんな助けでも大歓迎です!

4

2 に答える 2

2

Andrew Thompson と Andrew Mao のアドバイスに感謝します。

@Mao: 1.) Swing GUI スレッドを使用しています。2.)setVisible私の問題を修正する最後のアイデアでした:-P 3.) もちろん、この方法ではパフォーマンスが向上しますが、この場合、タブが 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 に答える
2

Swing の GUI スレッドでこのコードを実行していないようです。Runnableに渡されるのは内部SwingUtilities.invokeLater(...)ですか?removeAllその場合は動作するはずです。

また、setVisibleコンポーネントで直接使用するべきではありません。setSelectedIndexまたはsetSelectedComponentで使用する必要がありJTabbedPaneます。

JScrollPaneさらに、タブの合計順序が変わらない場合、すべてのタブを削除して、1 つを除くすべてのタブを新しく作成することは、非常に非効率的です。おそらく、リストを のようにソートされた順序で維持しTreeSet、更新があったときに適切なインデックスで単一のタブを挿入および削除する必要があります。

于 2013-01-05T16:27:26.937 に答える