К кому это может относиться:
Коллега нашел источник проблемы. В:
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));
Это уменьшит нижний зазор для ваших вкладок, и вы можете поместить «искусственный» разделитель на верхний край вашей панели контента. Вот так мы с этим справляемся.
Надеюсь, это поможет. Наслаждайтесь!