1

JTabbedPaneすべてのタブ (コンポーネントではなく実際のタブ) が同じ幅 (最も幅の広いラベルに必要な最小幅または一定の幅)の場所を取得しようとしています。

をオーバーライドしようとしましたがBasicTabbedPaneUI.getTabBounds(int tabIndex, Rectangle dest)、明らかにこのメソッドは の描画メソッドでは使用されずBasicTabbedPaneUI、代わりに rects 配列を使用してタブのサイズを決定します。

私の次のアプローチはJTabbedPane.insertTab(String title, Icon icon, Component component, String tip, int index)、ラベル コンポーネントの優先サイズをオーバーライドして設定することですが、これはあまりエレガントではないようで、まったく機能するかどうかさえわかりません。

これを達成する方法はありますか?

4

4 に答える 4

5

答えは簡単です。タブに名前を付けるときは、html を使用して名前をフォーマットするだけです。いう

tp - JTabbedPane オブジェクト

tp.addTab("<html><body><table width='150'>Name</table></body></html>",Componentobject)
于 2009-10-30T09:19:18.487 に答える
4

あなたがやったほど複雑ではないと思います。優先サイズを設定したJLabelでsetTabComponentAt()を使用するだけです。

于 2009-01-24T22:17:34.237 に答える
1

これは私のために働いています。

 JLabel lab = new JLabel();
        lab.setPreferredSize(new Dimension(200, 30));
        jTabbedPane1.setTabComponentAt(0, lab);  // tab index, jLabel

または、同じサイズのすべてのタブコンポーネントにこの変更を試してください(メインメソッドで呼び出されます)

UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab.contentMargins", new Insets(10, 100, 0, 0));

于 2014-06-03T02:03:14.880 に答える
1

私は次のことを試しました:

tabPane.setUI(new javax.swing.plaf.metal.MetalTabbedPaneUI() {
    @Override
    protected int calculateTabHeight(int tabPlacement, int tabIndex, int fontHeight) {
        return super.calculateTabHeight(tabPlacement, tabIndex, fontHeight) + 12;
    }
});

これは私にとってはうまくいくようです。しかし、別の L&F を使用している場合は、関係なく「金属」でレンダリングすることになります。

デフォルトのUIを取得し、それに対して「instanceof」を実行して、使用されているものを判断し、それに応じてインスタンス化できると思います。

例えば:

TabbedPaneUI ui = tabPane.getUI();

if (ui instanceof WindowsTabbedPaneUI) {
    // Create the windows rendition
} else if (ui instanceof MetalTabbedPaneUI) {
    // Create the metal rendition
} else if (ui instanceof MotifTabbedPaneUI) {
    // Create the motif rendition
} else if (ui instanceof SynthTabbedPaneUI) {
    // Etc...
}
于 2011-11-13T07:59:28.457 に答える