2013-01-05 66 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,並且在更新時只需在適當的索引處插入和移除一個標籤。

相關問題