Удалить последнюю вкладку jtabbedpane

Я немного смущен, потому что не могу удалить последнюю вкладку моего 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 перед тем, как удалить вкладки, но последняя вкладка в конце все еще видна. Я также пытался установитьVisible(), удалитьAll().

Любая помощь приветствуется!


person Steckdoserich    schedule 05.01.2013    source источник
comment
Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 05.01.2013
comment
Приведенные вопросы те же.   -  person trashgod    schedule 05.01.2013


Ответы (2)


Похоже, вы не используете этот код в Поток GUI Swing. Это внутри Runnable, которое передается SwingUtilities.invokeLater(...)? removeAll должно работать, если это так.

Кроме того, вы не должны использовать setVisible непосредственно для компонентов — вы должны использовать setSelectedIndex или setSelectedComponent для JTabbedPane.

Более того, удаление всех вкладок и повторное создание новой JScrollPane для всех, кроме одной, кажется ужасно неэффективным, если общий порядок вкладок не меняется. Возможно, вам следует поддерживать список в отсортированном порядке, например, TreeSet, и просто вставлять и удалять одну вкладку в соответствующем индексе при обновлении.

person Andrew Mao    schedule 05.01.2013

Спасибо за ваши советы в Эндрю Томпсон и Эндрю Мао.

@Mao: 1.) Я использую Swing GUI Thread. 2.) setVisible было моей последней идеей исправить мою проблему :-P 3.) Конечно, таким образом это было бы более производительно, но в этом случае я немного испачкался, потому что больше трех вкладки одновременно. Но я думаю, что я собираюсь изменить его позже.

@Thompson: Из-за SSCCE я создал проект только для своей проблемы (которую вы можете увидеть ниже), чтобы показать свою проблему. Но этот проект сработал, поэтому я сравниваю маленькие шаги своего тестового проекта с моим реальным проектом и нахожу небольшую ошибку.

Моя проблема заключалась в том, что я обновил вкладки до того, как удалил объект ArrayList, поэтому графический интерфейс по-прежнему отображал удаленный объект как вкладку.

Для всех, кому интересен мой тестовый проект 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);
            }
        });
    }
}
person Steckdoserich    schedule 05.01.2013
comment
+1 за использование sscce, чтобы сосредоточиться на проблеме. В целях безопасности используйте аннотацию @Override. Обратите внимание, что люди, адрес которых указан в ответе, не будут уведомлены. - person trashgod; 05.01.2013