2011-11-18 56 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