我错过了标签之间的蓝色水平分隔线和Nimbus L& F TabbedPane中设置为SCROLL的内容(其他L& Fs(默认&窗口)提供了这些)。
正如您所看到的,问题仅限于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()
到达那里会有什么魔力吗?
提前致谢!
答案 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));
这会将较低的间隙剥离到您的标签页,您可能会在内容面板的顶部边缘放置一个“假”分隔符。但这就是我们处理它的方式。
希望它有所帮助。享受!