2013-01-05 25 views
1

我有点困惑,因为我无法删除我的JTabbedPane的最后一个选项卡。 我看了这两个问题: first questionsecond question。但它对我没有帮助。 这是我的代码看起来像:删除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进行排序,因为我想让这些选项卡按升序排列。

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

欢迎任何帮助!

+1

为了更好地帮助越早,张贴[SSCCE(http://sscce.org/)。 –

+0

好吧,我会尝试。 – Steckdoserich

+0

引用的问题是一样的。 – trashgod

回答

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); 
      } 
     }); 
    } 
} 
+1

+1使用[sscce](http://sscce.org/)专注于一个问题。为了安全起见,请使用'@ Override'注释。请注意,答复中提到的人将不会收到通知。 – trashgod

2

看起来你可能没有在Swing's GUI thread上运行此代码。它在传递到SwingUtilities.invokeLater(...)Runnable内吗? removeAll应该工作,如果是这样的话。

而且,你不应该直接使用的组件setVisible - 你应该在使用JTabbedPanesetSelectedIndexsetSelectedComponent

此外,删除所有选项卡并为所有选项创建新的JScrollPane(除了其中一个选项之外),当选项卡的总顺序未发生变化时,效率似乎非常低下。也许你应该按照排序顺序维护一个列表,比如TreeSet,并且在更新时只需在适当的索引处插入和移除一个标签。

相关问题