2011-11-18 53 views
3

我基本上試圖在jtabbedpane中的每個選項卡中添加一堆JPanel,並且它自行工作正常。但是,當按照Javatutorial向每個選項卡添加閉合按鈕時,它會在第一次(並且只是第一次)添加按鈕之後將這個奇怪的tabContainer添加到jtabbedpane。我知道水族是MAC相關,但問題仍然存在Linux和Windows ..

IM basicly做:

JTabbedPane pane; 

this.add("channel",new JTextArea("texttexttext")); 

ButtonTabComponent ctb = new ButtonTabComponent(pane); 

this.setTabComponentAt(pane.indexOfTab("channel"),ctb); 

第一個選項卡也完美的作品,但添加了所有未來的人是在beeing推一個索引因爲在屏幕截圖中可以看到AquaTabbedPaneCopyFromBasicUI $ TabContainer。所以,當我試圖讓他們離開tabbedpane更新一些信息(檢查下面鏈接的代碼)我無法施放它,因爲從indexOfTab(Channel)返回的索引beeing是水的索引..

調試和jtabbedPane的陣列screenShot:http://server.westman.no/free/Skjermbilde%202011-11-18%20kl.%2012.32.02.png

最糟糕的是,我不能刪除tabbedpane中的索引2,我只是得到outOfBoundsException,但我可以使用getComponent(2),(和那裏我第一次發現錯誤,因爲我可以getComponent(標題),它試圖返回水色...然後我不能將它投射到一個單一的對象,這是什麼想要的)

這是一個超現實的問題,可能看起來就像你有一些事情要做的事情一樣,但是我一直在這裏待了一個星期,在有好幾個人看着它之後,我沒有接近解決方案。 (它可以當然是gotDamnUrADumbAss難題..)

希望這對某人有意義!

代碼中的問題: tabHandler:http://apps.netcrawlr.net/p/pastebin.php?show=41

評論,如果你想看看別的引用。

SSCCE:

package jtabbedtest; 

     import javax.swing.JFrame; 
     import javax.swing.JTabbedPane; 
     import javax.swing.JTextArea; 

     /** 
     * 
     * @author hallvardwestman 
     */ 
     public class Jtabbedtest { 

      /** 
      * @param args the command line arguments 
      */ 
      public static void main(String[] args) { 
       // TODO code application logic here 


       JFrame jf = new JFrame(); 
       JTabbedPane jt = new JTabbedPane(); 
     //debugChecks for whats in jtabbedpane  
     Object[] o = jt.getComponents(); 
       jf.add(jt); 

       jt.addTab("a",new JTextArea("a")); 
       int tabIndex = jt.indexOfTab("a"); 

       ButtonTabComponent ctb = new ButtonTabComponent(jt); 
       jt.setTabComponentAt(tabIndex, ctb); 
       /* 
       * adding closebutton 
       */ 
      //debugChecks for whats in jtabbedpane  
     o = jt.getComponents(); 
       jf.setVisible(true); 

       jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


      } 
     } 

and just put this : http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/components/TabComponentsDemoProject/src/components/ButtonTabComponent.java in a new file called ButtonTabComponent 
+2

請提供[SSCCE(http://sscce.org/)表現出的問題你描述。 – trashgod

+0

添加了一個快速的sscce,如果在o = jt處設置了斷點,會帶來相同的結果。getComponents();你可以看到它包含一個jtextarea和一個*別的東西*我得到AquaTabbedPaneCopyFromBasicUI $ TabContainer atleast .. – Hwestman

+0

在方法SeljeIRC.tabHandler.createNewTab(String,int)不應該做this.addTab(Channel,st) ;而不是this.add(Channel,st); ? – Zecas

回答

1

目前即時通訊開發使用JTabbedPane的太應用程序,一切正常對我來說,添加,刪除選中的標籤,其他標籤,所有標籤。

首先,你應該 - 不是必須 - 提供整數變量來保存你已經有標籤的總和,讓我們說這叫做tabCount

代碼來檢查,如果一個選項卡選項卡窗格的存在:

private boolean isTabExist(String title) { 
    for (int i = 0; i < tabCount; i++) { 
     if (jTabbedPane1.getTitleAt(i).equalsIgnoreCase(title)) { 
      jTabbedPane1.setSelectedIndex(i); 
      return true; 
     } 
    } 
    return false; 
} 

代碼中插入新的標籤:(在我的應用程序,如果該選項卡已添加,也不會再次添加)

if (!isTabExist("My Tab")) { 
     jTabbedPane1.insertTab("My Tab", null, yourCustomPanel, "My tab", tabCount); 
     jTabbedPane1.setSelectedIndex(tabCount); 
     tabCount = jTabbedPane1.getTabCount();    
    } 

刪除所選選項卡(在任何索引)

jTabbedPane1.remove(jTabbedPane1.getSelectedIndex()); // remove selected tab 
tabCount = jTabbedPane1.getTabCount(); 

嘗試上面的代碼,並告訴我,如果你仍然得到問題的一些指標以去除標籤...

+0

順便說一句,如果你想添加關閉功能到你的標籤窗格,我建議 - 就像我做的 - 創建彈出菜單,當你右鍵單擊每個標籤,顯示關閉標籤,或者另外,關閉其他和所有。我也是這麼做的,這對我來說工作正常.. – bangandi

+0

對不起,說這個問題已經解決了一個黑客,並完成項目。感謝艱難的迴應,它看起來像你的代碼會做到這一點。 – Hwestman