Как уже отмечалось @trashgod, компоновка вкладок обрабатывается специфическим для LAF SomeLAFTabbedPaneUI, в частности TabbedPaneLayout. Таким образом, способ пойти
- реализовать пользовательский подкласс MySomeLAFTabbedPaneUI, который имеет пользовательский расширенный TabbedPaneLayout (вы должны сделать это для каждого SomeLAF вы хотите поддержать
- заменить обычный пользовательский интерфейс с помощью пользовательского класса
Первые сводится к тому, вклиниться в расчет прямоугольников, которые используются для окраски вкладок/размещения пользовательского tabComponents Что-то вроде. (Примечания: очевидно, не производство готового :-)
public class XMetalTabbedPaneUI extends MetalTabbedPaneUI {
public static ComponentUI createUI(JComponent c) {
return new XMetalTabbedPaneUI();
}
@Override
protected LayoutManager createLayoutManager() {
return new XTabbedPaneLayout();
}
protected class XTabbedPaneLayout extends MetalTabbedPaneUI.TabbedPaneLayout {
protected Container tabContainer;
@Override
protected void calculateTabRects(int tabPlacement, int tabCount) {
super.calculateTabRects(tabPlacement, tabCount);
// TODO: check if it makes sense to stretch
int max = 0;
int sum = 0;
Rectangle r = new Rectangle();
for (int i = 0; i < tabCount; i++) {
getTabBounds(i, r);
max = Math.max(max, r.width);
sum += r.width;
}
// TODO: calculate real width, that is -insets
int paneWidth = tabPane.getWidth() - 10;
int free = paneWidth - sum;
// nothing to distribute
if (free < tabCount) return;
int add = free /tabCount;
int offset = 0;
for (int i = 0; i < tabCount; i++) {
r = rects[i];
r.x += offset;
r.width += add;
offset += add;
}
}
}
}
Во-вторых, очень упрощено (уклонился от меня, как разработчик проекта :-) механизмом улучшения платины, предоставленным SwingX (на самом деле все, что вам нужно, это его модуль и зависимости). Его основной строительный блок является TabbedPaneAddon, который загружает пользовательский интерфейс:
public class TabbedPaneAddon extends AbstractComponentAddon {
/**
* @param name
*/
public TabbedPaneAddon() {
super("TabbedPane");
}
@Override
protected void addMetalDefaults(LookAndFeelAddons addon,
DefaultsList defaults) {
// remove old ui
UIManager.getLookAndFeelDefaults().put("TabbedPaneUI", null);
defaults.add("TabbedPaneUI",
// here goes the full classname of your custom ui
// this is an example only :-)
"org.jdesktop.swingx.XMetalTabbedPaneUI");
}
// implement other addXXDefault as needed for
// supporting more LAFs
}
сделать замену произошла, вы должны внести свой вклад в аддоне («ранним») в своем приложении:
LookAndFeelAddons.contribute(new TabbedPaneAddon());
Вы нашли Look & Feel, который имеет желаемый 'TabbedPaneUI'? – trashgod
Я использую и изменяю defaut Look & feel (MetalTabbedPane). Есть ли Looke & Feel, у которого есть эта возможность «установки вкладок»? –