2

我想让我的标签标签共享 JTabbedPane 宽度。如果有一个标签,适合整个宽度,如果有两个标签,共享宽度,如果三个,每个 1/3 等等......

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

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

4

2 回答 2

6

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

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

第一个归结为用于绘制选项卡/定位自定义选项卡组件的矩形计算。类似的东西(注意:显然还没有准备好生产:-)

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 模块和依赖项)。它的基本构建块是加载自定义 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()); 
于 2013-07-21T15:18:46.570 回答
2

是否有具有这种“标签装配”功能的外观和感觉?

我不知道,但您可能会为可能看到类似内容的其他人发布插图。由于外观由 L&F 的 UI 委托控制,因此TabbedPaneUI您需要查找现有实现或其后代之一:BasicTabbedPaneUIMetalTabbedPaneUI.

于 2013-07-20T14:07:06.543 回答