gpt4 book ai didi

java - JTabbedPane 选项卡组件调整大小以适应

转载 作者:行者123 更新时间:2023-12-04 20:46:01 34 4
gpt4 key购买 nike

我想让我的选项卡标签共享 JTabbedPane 宽度。如果有一个标签,适合整个宽度,如果两个标签共享宽度,如果三个,每个 1/3,依此类推...

我什至不知道是否可以在不将组件放在那里并调整其大小的情况下做到这一点,也许 JTabbedPane 有一种方法可以通过方法调整其标签标签的大小,但我不知道...

有人知道如何以最简单的方式制作它吗?

最佳答案

正如@trashgod 已经指出的那样,选项卡布局由特定于 LAF 的 SomeLAFTabbedPaneUI 处理,更具体地说是 TabbedPaneLayout。所以要走的路是

  • 实现自定义子类 MySomeLAFTabbedPaneUI,它具有自定义扩展的 TabbedPaneLayout(您需要为每个要支持的 SomeLAF 执行此操作
  • 用您的自定义类替换普通的 ui

第一个归结为 Hook 计算用于绘制选项卡/定位自定义 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 提供的 plaf 增强机制高度简化的(对我有偏见,作为项目的维护者:-) (实际上你只需要它的 plaf 模块和依赖项)。它的基本构建 block 是加载自定义 ui 的 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()); 

关于java - JTabbedPane 选项卡组件调整大小以适应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17754098/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com