Nimbus L&F在设置JTabbedPane为滚动时缺少分隔符。

5
在Nimbus L&F TabbedPane设置为SCROLL时,我没有看到标签和内容之间的蓝色水平分隔线(其他L&Fs(默认和 Windows)提供了这些)。如下图所示,问题仅限于new JTabbedPane(JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT)(图片顶部),而WRAP默认情况下不会显示此行为(图片底部)。
可以通过覆盖NimbusDefaults.class的某些部分来更改这样的东西。以下是摘录:
//Initialize TabbedPane
    d.put("TabbedPane.contentMargins", new InsetsUIResource(0, 0, 0, 0));
    d.put("TabbedPane.tabAreaStatesMatchSelectedTab", Boolean.TRUE);
    d.put("TabbedPane.nudgeSelectedLabel", Boolean.FALSE);
    d.put("TabbedPane.tabRunOverlay", new Integer(2));
    d.put("TabbedPane.tabOverlap", new Integer(-1));
    d.put("TabbedPane.extendTabsToBase", Boolean.TRUE);
    d.put("TabbedPane.useBasicArrows", Boolean.TRUE);
    addColor(d, "TabbedPane.shadow", "nimbusDisabledText", 0.0f, 0.0f, 0.0f, 0);
    addColor(d, "TabbedPane.darkShadow", "text", 0.0f, 0.0f, 0.0f, 0);
    ... more ...

我似乎无法弄清楚Nimbus在哪里以及如何区分WRAP和SCROLL。请问有人可以告诉我,我需要使用什么神奇的方法来.put()到那里呢?

先提前感谢!


+1 很好,请您提供一下这个问题的答案吗?https://dev59.com/8VvUa4cB1Zd3GeqPtnA5 - mKorbel
谢谢你的信任,但我不知道该怎么做。我看了一下,但没有发现解决你问题的方法。尝试解决这个问题的人可能会从你在问题中发布的SSCCE中受益。谢谢! - Omphaloskopie
1个回答

2

敬启者:

一位同事找到了问题的源头。在:

package javax.swing.plaf.synth.SynthTabbedPaneUI;

它说:

protected void paint(SynthContext context, Graphics g) {
    int selectedIndex = tabPane.getSelectedIndex();
    int tabPlacement = tabPane.getTabPlacement();

    ensureCurrentLayout();

// Paint tab area
// If scrollable tabs are enabled, the tab area will be
// painted by the scrollable tab panel instead.
//
if (!scrollableTabLayoutEnabled()) { // WRAP_TAB_LAYOUT

        [...]

        // Here is code calculating the content border

        [...]

    }

    // Paint content border
    paintContentBorder(tabContentContext, g, tabPlacement, selectedIndex);
}

如您所见,可滚动的标签布局在下面的代码中被排除在分隔符大小计算之外。如果您跟随括号,您会发现:它稍后会被绘制,但使用了错误的参数。这导致如果选项卡设置为顶部或左侧内容,则分隔符会被省略。如果设置为右侧或底部,则分隔符实际上会显示,但是会有问题(边框朝向内容太厚,总体长度不够)。
要覆盖从 Synth 到 Nimbus 的所有内容需要相当大的工作量,因为有很多最终和包保护类。
因此,您可能希望采用更简单的方法:
uiDefaults.put("TabbedPane:TabbedPaneTabArea.contentMargins", new InsetsUIResource(3, 10, 0, 10));    

这将消除您选项卡下方的间隙,您可以在内容面板的顶部边缘放置一个“虚假”分隔符。这是我们处理它的方式。希望能对您有所帮助。享受吧!

如果有人提出更好/更容易的解决方案,我会切换“正确答案”标志。 - Omphaloskopie

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