【问题标题】:Is there a way to hide the tab bar of JTabbedPane if only one tab exists?如果只存在一个选项卡,有没有办法隐藏 JTabbedPane 的选项卡栏?
【发布时间】:2010-10-30 20:39:18
【问题描述】:

我想要一个类似于例如的行为Firefox 只有在至少存在两个选项卡时才会显示可用选项卡列表。

我还没找到类似的东西。

我的最佳想法是手动更改布局:

  • 如果是一个组件,只需将其添加到周围的面板中
  • 如果添加了组件,请从周围的面板中移除该组件,改为添加 JTabbedPane,并将之前的组件和新组件都添加到该面板中。
  • 如果删除了一个组件,并且窗格中只剩下一个组件,请删除窗格并添加包含的组件。

虽然这可能会奏效,但感觉就像是一种破解或解决方法......

有更好的主意吗?

理想情况下,一个解决方案应该在 Java 1.5 和 1.6 中都可以工作......但我也很高兴只有 1.6 的解决方案。

【问题讨论】:

    标签: java user-interface swing jtabbedpane


    【解决方案1】:

    您可以覆盖计算选项卡按钮区域高度的 UI 方法,当只有一个选项卡时,将高度强制为0

    tabbed_pane.setUI(new BasicTabbedPaneUI() {  
        @Override  
        protected int calculateTabAreaHeight(int tab_placement, int run_count, int max_tab_height) {  
            if (tabbed_pane.getTabCount() > 1)
                return super.calculateTabAreaHeight(tab_placement, run_count, max_tab_height);  
            else  
                return 0;  
        }  
    });  
    

    【讨论】:

    • 这行得通,但是我的 TabbedPane 上有一个细的彩色顶部边框,它在标签所在的区域被遗漏了。尝试一下并对“paintTabBorder”和“paintTabBackground”进行几乎相同的覆盖解决了这个问题。
    【解决方案2】:

    我相信您必须手动完成。显然是it has been done before,但只是一个似乎不可用的系统的一小部分。

    我觉得你的方法不错。我会按照您的说明进行操作,并将所有这些逻辑包装在自定义 JComponent 中,这样它就不会那么骇人听闻了。

    【讨论】:

    • 在检查答案之前,我会再等一会儿,看看是否有人有绝妙的主意......
    • 我同意@mmyers。如果有人有一个预先构建的组件来执行此操作,我很确定它会以这种方式工作。
    • 对不起。如果有人发现或制造了这样的组件,我很想听听。
    【解决方案3】:

    您最好只使用CardLayout

    【讨论】:

    • 总体思路不错,但我想要一个 JTabbedPane,包括。关于PLAF的各种外观。无论如何,感谢您的意见。
    • 简单 jTabbedPane1.setLayout(new CardLayout()); +50!
    • @eugener 您能否添加一些如何将 CardLayout 与 jTabbedPane1 一起使用的示例?是否可以为这个对象设置 CardLayout,例如为其他对象设置 AbsoluteLayout??
    【解决方案4】:

    是的,有办法。我花了四个小时在 oracle 网站上找到: http://docs.oracle.com/javase/7/docs/api/javax/swing/JTabbedPane.html#setTabLayoutPolicy()

    只需使用这个:

    //declare
    private JTabbedPane editor = new JTabbedPane ();
    //construct like this:
    editor.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
    //just add components and see how it goes.
    editor.addTab("", newPanel);
    

    【讨论】:

      【解决方案5】:

      另一个选项是自定义 JTabbedPane 使用的 L&F 委托(BasicTabbedPaneUI 或 WindowsTabbedPaneUI,具体取决于您关心的平台)。这将允许您在仅显示单个选项卡的情况下自定义选项卡式窗格的行为。

      这是另一种做事方式,但我会说这是一项艰巨的任务,按照迈克尔所说的去做,你会用更少的努力到达你想去的地方。我只是想将此作为答案发布,以防您不知道此选项。

      【讨论】:

        【解决方案6】:

        我认为这可以使用标签栏和卡片布局来实现,

        • 将标签栏和卡片布局添加到网格包布局中,以便它们 自动调整大小
        • 标签栏的最大高度应该是标签的高度
        • 为标签栏添加一个监听器,以便在单击某些标签时它 将切换卡片布局以显示适当的内容
        • 如果标签栏只有一个标签,则隐藏它

        这应该可以完成工作。

        【讨论】:

          【解决方案7】:

          jTabbedPane1.removeTabAt(0); 似乎在initComponents(); 之后工作

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-13
            相关资源
            最近更新 更多