Nimbus L & F отсутствует разделитель на JTabbedPane установлен для прокрутки - PullRequest
4 голосов
/ 17 ноября 2011

Мне не хватает синего горизонтального разделителя между вкладками и содержимым в Nimbus L & F TabbedPane, для которого установлено значение SCROLL (другие L & F (по умолчанию и окна) предоставляют их).

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 ...

Я просто не могу понять, где и как Нимб различает WRAP и SCROLL. Может кто-нибудь сказать мне, какую магию я должен .put(), чтобы туда добраться?

Заранее спасибо!

1 Ответ

1 голос
/ 21 ноября 2011

К кому это может относиться:

Коллега нашел источник проблемы. В:

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 исключен из следующего кода, где вычисляется размер разделителя. Следуя квадратным скобкам, вы видите, что позже оно все же будет нарисовано, но с неверными параметрами. Это приводит к тому, что разделитель опускается, если для вкладок установлено значение «TOP» или «LEFT» содержимого. Если установлено значение ВПРАВО или ВНИЗ, разделитель фактически отображается, но прерывается (граница слишком толстая, в целом недостаточно длинная.

Чтобы переопределить все, от Synth до Nimbus, потребовалось бы немало усилий, потому что существует множество финальных и защищенных пакетами классов.

Поэтому вы можете выбрать более легкий маршрут:

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

Это уменьшит нижний зазор для ваших вкладок, и вы можете поместить «искусственный» разделитель на верхний край вашей панели контента. Вот так мы с этим справляемся.

Надеюсь, это поможет. Наслаждайтесь!

...