0

元の上部タブの向きの設定:

http://dl.dropbox.com/u/3238736/screenshots/Screenshot-PasswordStore-1.png

問題のある右タブの向きの設定:

ここに画像の説明を入力

上記の GUI から、私の JTabbedPane (右側の青い色のタブ) が "Quit" ボタン (GlassPane を使用してレンダリングされる) に重なっています。

注: [終了] ボタンは、GlassPane を使用して右上にレンダリングされます。

青色のタブを移動して「終了」ボタンのスペースを確保するための技術的なアドバイスをお願いします。

以下に示すように、[終了] ボタンを挿入する GlassPane を作成するためのコード:

public void addUniversalQuitBtn() {
    // Thanks to http://www.java-forums.org/awt-swing/12267-how-add-jbutton-tabbed-pane-headder.html forum post regarding adding a button on glasspane.
    Rectangle tabBounds = mainTabPane.getBoundsAt(0);
    Container glassPane = (Container) this.getRootPane().getGlassPane();
    glassPane.setVisible(true);
    glassPane.setLayout(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.weightx = 1.0;
    gbc.weighty = 1.0;
    gbc.fill = GridBagConstraints.NONE;
    gbc.insets = new Insets(tabBounds.y, 0, 0, 10);
    gbc.anchor = GridBagConstraints.NORTHEAST;
    quitBtn.setPreferredSize(new Dimension(quitBtn.getPreferredSize().width, (int) tabBounds.getHeight() - 2));
    glassPane.add(quitBtn, gbc);

}

ありがとう。

4

2 に答える 2

1

さて、終了ボタンをガラスペインから適切なコンテナに移動することをお勧めしますが、標準の Swing JTabbedPane ではそのように配置することはできません...

したがって、ここにある種の解決策があります:

public static void main ( String[] args )
{
    JFrame frame = new JFrame ();

    Insets current = UIManager.getInsets ( "TabbedPane.tabAreaInsets" );
    UIManager.put ( "TabbedPane.tabAreaInsets",
            new Insets ( current.top, 40, current.bottom, current.right ) );

    JTabbedPane tabbedPane = new JTabbedPane ();
    tabbedPane.setTabPlacement ( JTabbedPane.RIGHT );
    tabbedPane.addTab ( "Tab 1", new JLabel () );
    tabbedPane.addTab ( "Tab 2", new JLabel () );
    frame.add ( tabbedPane );

    UIManager.put ( "TabbedPane.tabAreaInsets", current );

    JTabbedPane tabbedPane2 = new JTabbedPane ();
    tabbedPane2.setTabPlacement ( JTabbedPane.RIGHT );
    tabbedPane2.addTab ( "Tab 3", new JLabel () );
    tabbedPane2.addTab ( "Tab 4", new JLabel () );
    frame.add ( tabbedPane2, BorderLayout.SOUTH );

    frame.setSize ( 400, 400 );
    frame.setLocationRelativeTo ( null );
    frame.setVisible ( true );
}

最初のタブ付きペイン (上の 1 つ) には、上部とタブの間に 30 ピクセルのギャップがあります。2 番目のタブ付きペインには、デフォルトのギャップ セットがあります。

「TabbedPane.tabAreaInsets」キーの下のインセットを変更することにより、タブランとタブ付きペインの辺の間の間隔を操作できます。タブの位置が TOP と異なる場合、これらのインセットが回転することに注意してください。したがって、右のタブ位置で上部の間隔を変更する場合は、私の例で行ったように、上部ではなく左側を変更する必要があります。

古い Insets 値を元に戻すことを忘れないでください。そうしないと、その変更は、変更後に作成されたすべてのタブ付きペインに影響します。

また、これがすべてのネイティブ UI で機能することを保証することはできませんが、そのような基本的な機能はサポートされるべきだと思います。少なくとも、Windows、Mac OS、Metal LaF でサポートされています。

もう1つ-作成時に特定のシステムUIに保存され、その値を更新することはできないため、既に作成されたタブ付きペインの実行時にタブ領域インセットを変更することはできません(少なくともリフレクションを使用しないと " features" およびプライベート フィールドへの乱暴なアクセス)。そのため、1 種類のタブ配置でのみギャップが必要な場合は、タブ付きペインを再作成する必要があります。

于 2012-04-19T12:16:32.987 に答える
0

わかった。私には少し奇妙に聞こえます...しかし、2つのボタンを持つことができます.1つはGlassPaneにあり(TabbedPaneが上向きの場合に表示されます)、もう1つは上部のバーに表示されます(TabbedPaneが右向きの場合に表示されます)

于 2012-04-19T05:30:47.733 に答える