5

我缺少选项卡和 Nimbus L&F TabbedPane 中设置为 SCROLL 的内容之间的蓝色水平分隔线(其他 L&F(默认和窗口)提供这些)。

在此处输入图像描述

如您所见,问题仅限于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()才能到达那里吗?

提前致谢!

4

1 回答 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);
}

如您所见,在计算分隔线大小的以下代码中排除了 scrollableTabLayout。当您遵循括号时,您会看到:稍后它仍然被绘制,但参数错误。如果选项卡设置为内容的顶部或左侧,这将导致省略分隔符的行为。如果设置为 RIGHT 或 BOTTOM,则实际上会显示分隔线,但会损坏(朝向内容的边框太厚,整体不够长。

覆盖从 Synth 到 Nimbus 的所有内容需要相当大的努力,因为有很多 final 和包保护的类。

因此,您可能希望采取更简单的路线:

uiDefaults.put("TabbedPane:TabbedPaneTabArea.contentMargins", new InsetsUIResource(3, 10, 0, 10));    

这将剥离标签的下部间隙,您可以在内容面板的顶部边缘放置一个“假”分隔线。不过,这就是我们处理它的方式。

希望能帮助到你。享受!

于 2011-11-21T11:52:28.697 回答