繁体   English   中英

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

[英]JTabbedPane tab component resize to fit

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

我甚至不知道是否可以在没有放置组件并调整大小的情况下这样做,也许JTabbedPane有办法通过方法调整它的标签标签,我不知道......

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

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

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

第一个可以归结为用于绘制制表符/定位自定义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模块和依赖项)。 它的基本构建块是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
}

要进行替换,您必须在应用程序中添加插件(“早期”):

LookAndFeelAddons.contribute(new TabbedPaneAddon()); 

有没有具有这种“标签适应”功能的外观和感觉?

我不知道一个,但你可能会发布一个插图给其他可能见过类似东西的人。 由于外观由L&F的UI委托,控制TabbedPaneUI ,你需要或者寻找现有的实现或子类及其后代的一个: BasicTabbedPaneUIMetalTabbedPaneUI

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM