Nimbus L&F缺少JTabbedPane的分隔线设置滚动

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

在此处输入图像描述

正如您所看到的,问题仅限于new JTabbedPane(JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT) (图片顶部),而WRAP的默认设置不显示此行为(图片底部)。

应该可以通过覆盖NimbusDefaults.class部分来改变这样的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()到达那里?

提前致谢!

敬启者:

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

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

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

希望能帮助到你。 请享用!