2

我有一个 JTabbedPane,当用户选择它时我需要替换选项卡 1 组件。我无法在应用程序启动时直接添加正确的组件,因为我没有完整的数据来生成它。

我需要这样的东西:

    int tabTochange = 1;
    tabbedPane.addChangeListener(new ChangeListener() {
        public void stateChanged(ChangeEvent e) {
            if (tabbedPane.getSelectedIndex() == tabTochange)
            {
                JComponent component = generataComponent();
                tabbedPane.removeTabAt(tabTochange); // Remove old tab
                // add new one
                tabbedPane.insertTab("title", null, component, "tip", tabTochange);

            }
        }
    });

但是此代码不起作用,它会删除选项卡 1 之后的其他选项卡并将其复制。

4

3 回答 3

3

而不是removeTabAt()and insertTab(),使用getComponentAt(tabTochange)orgetSelectedComponent()来获取组件的引用。根据需要更新组件,可能使用CardLayout.

于 2013-05-31T10:11:57.460 回答
2
  • 我认为 JTabbedPane / CardLayout 是作为静态 GUI 开发的,没有添加/删除/修改选项卡/卡片,而不是在运行时更改选项卡/卡片的数量、订单、数量,即使有可能

  • 您需要解决一堆副作用,将选项卡(索引及其 JComponents )保存在辅助数组中

  • 将 JList(JTree 取决于结构)放在 JFrame 的左侧,为每个 Items/Nodes 创建一个 JPanel,将这些 JPanel 放入 CardLayout,添加适当的 List(Tree)SelectionListener,然后从鼠标/键盘选择将触发卡片之间的切换,这个结构中没有任何东西是动态的(除了 JComponents 中的值),一切都是在 GUI 启动时准备好的

于 2013-05-31T10:10:45.027 回答
0

如果 tab1 的索引为 1,而 tab2 的索引为 2。删除 tab1 后,tab2 现在的索引不是 1 吗?因此,当您添加索引为 1 的新选项卡时,它将不起作用。也许有一种方法可以改变tab1。

此外,每个选项卡都应该包含一个 JPanel,因此只需更改相关的 JPanel 和选项卡的标题文本可能是值得的。

我知道这并不能完全回答您的问题,但我认为我没有足够的积分将其作为评论。希望这可以帮助 :)

于 2013-05-31T10:13:35.870 回答