Thi*_*eão 2 java swing tabs width jtabbedpane
我想让我的标签标签共享JTabbedPane宽度.如果有一个标签,适合整个宽度,如果两个标签,共享宽度,如果三个,每个1/3等等...
我甚至不知道是否可以在没有放置组件并调整大小的情况下这样做,也许JTabbedPane有办法通过方法调整它的标签标签,我不知道......
任何人都知道如何以最简单的方式制作它?
正如@trashgod已经指出的那样,选项卡布局由LAF特定的SomeLAFTabbedPaneUI处理,更具体地说是TabbedPaneLayout.所以要走的路是
第一个可以归结为用于绘制制表符/定位自定义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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
第二个是高度简化的(偏向我,作为项目的维护者:-)由SwingX提供的plaf增强机制(实际上你只需要它的plaf模块和依赖项).它的基本构建块是TabbedPaneAddon,它加载自定义ui:
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
}
Run Code Online (Sandbox Code Playgroud)
要进行替换,您必须在应用程序中添加插件("早期"):
LookAndFeelAddons.contribute(new TabbedPaneAddon());
Run Code Online (Sandbox Code Playgroud)