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

时间:2011-11-17 12:11:39

标签: java swing jtabbedpane nimbus

我错过了标签之间的蓝色水平分隔线和Nimbus L& F TabbedPane中设置为SCROLL的内容(其他L& Fs(默认&窗口)提供了这些)。

enter image description here

正如您所看到的,问题仅限于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&滚动。有人可以告诉我,.put()到达那里会有什么魔力吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

可能涉及的人:

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

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);
}

如您所见,scrolllableTabLayout从以下代码中排除,其中计算分隔符的大小。当你按照你所看到的括号进行操作时:它稍后会被绘制,但是有错误的参数。如果选项卡设置为内容的TOP或LEFT,则会导致省略分隔符的行为。如果设置为RIGHT或BOTTOM,实际上会显示分隔符,但是会损坏(边框朝向内容太厚,总体上不够长。

要覆盖从Synth到Nimbus的所有内容需要相当多的efford,因为有很多最终版本和受包保护的类。

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

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

这会将较低的间隙剥离到您的标签页,您可能会在内容面板的顶部边缘放置一个“假”分隔符。但这就是我们处理它的方式。

希望它有所帮助。享受!