Java 选项卡位于JTabbedPane或一行中的固定位置

Java 选项卡位于JTabbedPane或一行中的固定位置,java,swing,tabs,jtabbedpane,Java,Swing,Tabs,Jtabbedpane,在我们的应用程序中,JTabbedPane具有无限选项卡,当选项卡的宽度超过选项卡窗格的宽度时,选项卡开始包装成几行。然后,当您单击上面一行中的选项卡时,整行将向下显示到前景。对于在多个选项卡之间单击的用户来说,这是非常混乱的,因为不可能跟踪选项卡顺序 我怎么能这样呢 -将标签钉在固定位置,同时将其内容放在前面(虽然这会从光学角度破坏标签隐喻,但我不在乎),或者 -将行数限制为一行(这样选项卡就会变得非常窄,而不是环绕)?非常快而且脏(肯定需要改进和更改),但我可以想象这样的东西对您有用(但不是

在我们的应用程序中,JTabbedPane具有无限选项卡,当选项卡的宽度超过选项卡窗格的宽度时,选项卡开始包装成几行。然后,当您单击上面一行中的选项卡时,整行将向下显示到前景。对于在多个选项卡之间单击的用户来说,这是非常混乱的,因为不可能跟踪选项卡顺序

我怎么能这样呢 -将标签钉在固定位置,同时将其内容放在前面(虽然这会从光学角度破坏标签隐喻,但我不在乎),或者 -将行数限制为一行(这样选项卡就会变得非常窄,而不是环绕)?

非常快而且脏(肯定需要改进和更改),但我可以想象这样的东西对您有用(但不是JTabbePane):


WrapLayout是从SO的另一篇文章中摘取的。

经过几个小时的研究,我终于找到了一个干净的解决方案

首先,找出您正在使用的UI类。使用
UIManager.setLookAndFeel()初始化L&F后,输入以下代码。

如果eclipse无法识别该类,并且如果键入该类的全名,则会出现“访问限制”错误,请参见以下问题:

最后,只需为JTabbedPane设置该UI:

JTabbedPane jtp = new JTabbedPane();
jtp.setUI(jtpui);
然而,有一个问题:一些L&F没有考虑标签行的非滚动,结果很糟糕

要解决此问题(我仅在Windows L&F上测试),请在初始化L&F后立即添加以下内容:
UIManager.getDefaults().put(“TabbedPane.tabRunOverlay”,0)


切换到另一种控制方式如何?例如列表或树?
setTabLayoutPolicy()
可能就是您正在寻找的for@Guillaume,setTabLayoutPolicy()只有两个值:scroll或wrap,这两个值在这里都不好。@Randy,似乎不可能here@Guillaume,滚动策略实际上我也在考虑,但我想知道是否有更好的选择。回答得好,假设没有简单的方法来修改JTabbedPane。谢谢如果确实需要,可以扩展JTabbedPane并覆盖JTabbedPane中的每个方法(没有那么多),然后将它们映射到上面的方法。
for (Map.Entry<Object, Object> entry : UIManager.getDefaults().entrySet()) {
    boolean isStringKey = entry.getKey().getClass() == String.class ;
    String key = isStringKey ? ((String) entry.getKey()):"";   
    if (key.equals("TabbedPaneUI")) {
        System.out.println(entry.getValue());
    }
}
WindowsTabbedPaneUI jtpui = new WindowsTabbedPaneUI() {
    @Override protected boolean shouldRotateTabRuns(int i) {
        return false;
    }
};
JTabbedPane jtp = new JTabbedPane();
jtp.setUI(jtpui);