JTabbedPane:如何在选项卡内部更改标题

5

我已经尝试了几个小时来优化我的用户界面,但目前还没有取得任何进展。 我使用了一个JTabbedPane来显示数据集。其中有一个文本字段应该也表示标签的标题。现在有一个标有“保存”的按钮,它除了从当前选项卡中读取此文本字段并更新选项卡的标题之外,什么也不做。我希望通过在字段更改时更新标签的标题来取代它。我已经激活了事件侦听器,所以这里没有问题。但是我怎样才能调用JTabbedPane对象呢? 我试图将一个JTabbedPane变量放入我的JPanel类中并存储一个引用,但当我调用此变量的setter方法时,它会崩溃...... 实际上并不会崩溃,但会抛出异常:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:635)
at java.util.ArrayList.get(ArrayList.java:411) 
[...]

设置器非常简单:
public void setTabContainer(JTabbedPane cont){
    container = cont;
 }

任何想法?

堆栈跟踪和您发布的方法没有任何关系。这一点应该很明显,因为在那个堆栈跟踪中没有提到您的方法。请查看您省略的堆栈跟踪部分,找到导致问题的方法。 - Holger
3个回答

7
我已经成功运行了事件监听器,所以这方面没有问题,但是我该如何调用JTabbedPane对象呢?
您可以使用以下方式的SwingUtilities类来获取您的文本字段祖先中的选项卡窗格:
JTabbedPane tabbedPane = (JTabbedPane)SwingUtilities.getAncestorOfClass(JTabbedPane.class, textField);

然后,您可以按顺序迭代选项卡窗格中的组件,以查找您的文本字段所在的索引,最后更新选项卡的标题:

for(int i = 0; i < tabbedPane.getTabCount(); i++) {
    if(SwingUtilities.isDescendingFrom(textField, tabbedPane.getComponentAt(i))) {
        tabbedPane.setTitleAt(i, textField.getText());
        break;
    }
}

查看以下API:


1

尝试:

JTabbedPane tabbedPane = (JTabbedPane) SwingUtilities.getAncestorOfClass(JTabbedPane.class, this);
tabbedPane.setTitleAt(tabbedPane.indexOfTabComponent(this), title);

假设this是选项卡组件,title是新标题。请注意,您必须将this设置为选项卡的内容。
使用:

0
在 IntelliJ IDEA 的表单设计器中,每个选项卡都是一个 JPanel,因此您可以使用以下方法从 Java 代码中设置标题:
public static void setTabTitle(JPanel tab, String title)
{
    JTabbedPane tabbedPane = (JTabbedPane) SwingUtilities.getAncestorOfClass(JTabbedPane.class, tab);

    for (int tabIndex = 0; tabIndex < tabbedPane.getTabCount(); tabIndex++)
    {
        if (SwingUtilities.isDescendingFrom(tab, tabbedPane.getComponentAt(tabIndex)))
        {
            tabbedPane.setTitleAt(tabIndex, title);
            break;
        }
    }
}

这个解决方案与dic19给出的非常相似。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接