2

タブ ラベルを JTabbedPane の幅と共有したいと考えています。タブが 1 つの場合は幅全体に合わせ、タブが 2 つある場合は幅を共有し、タブが 3 つある場合はそれぞれ 1/3 など...

そこにコンポーネントを配置してサイズを変更せずにそれを行うことが可能かどうかさえわかりません.JTabbedPaneにはメソッドを介してタブラベルのサイズを変更する方法があり、わかりません...

可能な限り簡単な方法でそれを作成する方法を知っている人はいますか?

4

2 に答える 2

6

@trashgod が既に述べたように、タブ レイアウトは LAF 固有の SomeLAFTabbedPaneUI、より具体的には TabbedPaneLayout によって処理されます。だから行く方法は

  • カスタム拡張 TabbedPaneLayout を持つカスタム サブクラス MySomeLAFTabbedPaneUI を実装します (サポートするすべての SomeLAF に対してこれを行う必要があります)。
  • 通常のUIをカスタムクラスに置き換えます

1 つ目は、タブの描画/カスタム 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;
            }

        }

    }
}

2 つ目は、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 に答える