Я наконец нашел решение.
Как сказал @Joe Coder, вы должны переопределить метод calculateTabRects()
. Однако этот метод находится во внутреннем классе. Невозможно расширить BasicTabbedPaneUI
или внутренний класс, потому что слишком много защищенных и закрытых полей. Решение состоит в том, чтобы воссоздать соответствующие классы, скопировав весь их код.
Исходный код от здесь .
Соответствующая модификация в методе calculateTabRects()
, более конкретно, в методе for:
// Step through runs from back to front to calculate
// tab y locations and to pad runs appropriately
for (i = runCount - 1; i >= 0; i--) {
//...
}
Простая итерация в обратном направлении делает трюк: for (i = 0; i < runCount; i++) {...}
Теперь, если вы скопируете и вставите код BasicTabbedPaneUI
, вы обнаружите, что вам также нужно скопировать и вставить LazyActionMap
и BasicGraphicsUtils
.
Для удобства вот весь код, который вам нужно скопировать и вставить. Убедитесь, что не переопределяете пакет, если он не находится в пакете javax.swing.plaf.basic
, он не будет работать.
FixedTabbedPaneUI.java: https://pastebin.com/W8RBD4vg
LazyActionMap2.java: https://pastebin.com/RKtDgJB5
BasicGraphicsUtils2.java: https://pastebin.com/Au4hcSyp
Но, в моем случае, мне нужна WindowsTabbedPaneUI
. Итак, вот WindowsTabbedPaneUI2.java: https://pastebin.com/89UedgbQ
.. XPStyle2.java: https://pastebin.com/xCsm8DZc
.. и AnimationController2.java: https://pastebin.com/7Pm0s5eG
Здесь заканчивается ООП-ад, но в текущем состоянии строки между «прогонами» (строки табуляции) исчезают
![enter image description here](https://i.stack.imgur.com/5Xl6M.png)
Решение заключается в том, чтобы после выбора интерфейса с UIManager.setLookAndFeel()
поставить следующее:
UIManager.getDefaults().put("TabbedPane.tabRunOverlay", 0);
UIManager.getDefaults().put("TabbedPane.focus", new Color(0, 0, 0, 0));
Результат:
![enter image description here](https://i.stack.imgur.com/TfDrw.png)