5

JFrame 内には JTabbedPane しかありません。JTabbedPane は、その寸法を最大のページ幅/高さに設定します。ページのサイズが異なるため、他のページを選択するときに JTabbedPane のサイズを強制的に変更することはできますか?

http://grab.by/3hIg

上の 1 つは現在の動作であり、下の 1 つはどのように動作するかです (手動でフレームのサイズを変更しました)。

4

3 に答える 3

4

これはかなり単純です。これには、ページのサイズの差を動的に計算し、それらを使用して優先サイズを強制することが含まれますJTabbedPane。簡単な実験を行ったところ、うまくいきました。したがって、ここに多くのテキストを配置する代わりに、ここにコードを示します。完璧ではありませんが、アイデアを得る必要があります。もちろん、質問も大歓迎です。

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Test {

    private static int maxW = 0;
    private static int maxH = 0;

    public static void main(String[] args) {


        final JFrame f = new JFrame();

        final JTabbedPane tabs = new JTabbedPane();

        tabs.add( createPanel(Color.RED, 100, 100), "Red");
        tabs.add( createPanel(Color.GREEN, 200, 200), "Green");
        tabs.add( createPanel(Color.BLUE, 300, 300), "Blue");

        final Dimension originalTabsDim = tabs.getPreferredSize();

        tabs.addChangeListener(new ChangeListener() {

            @Override
            public void stateChanged(ChangeEvent e) {

                Component p =   ((JTabbedPane) e.getSource()).getSelectedComponent();
                Dimension panelDim = p.getPreferredSize();

                Dimension nd = new Dimension(
                        originalTabsDim.width - ( maxW - panelDim.width),
                        originalTabsDim.height - ( maxH - panelDim.height) );

                tabs.setPreferredSize(nd);

                f.pack();
            }

        });

        f.setContentPane(tabs);
        f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        f.pack();
        f.setLocationRelativeTo(null);

        f.setVisible(true);


    }

    private static final JPanel createPanel( Color color, int w, int h ) {

        JPanel p = new JPanel();
        p.setBackground(color);
        p.setPreferredSize( new Dimension(w, h));

        maxW = Math.max(w, maxW);
        maxH = Math.max(h, maxH);

        return p;

    }

}
于 2010-03-24T19:50:51.163 に答える
3

別のオプションは、タブが選択されたときに各タブのパネルを動的に変更することだと思います:

  1. JTabbedPane選択時にリスナーをインストールする
  2. デフォルトで選択されたタブを除くすべてのタブに空のパネルをインストールします(そのタブの実際のパネルを含みます)
  3. 選択リスナーで:
    • 以前に選択したタブからパネルを削除します (つまり、空のパネルに置き換えます)
    • 新しく選択されたタブの実際のパネルで空のパネルを変更します
    • pack()を含むウィンドウ/ダイアログで呼び出すJTabbedPane

免責事項:このアプローチはテストしていませんが、必要に応じて機能するはずです。

また、選択したタブに基づいてダイアログのサイズを動的に変更することは、純粋な GUI の観点からはあまりユーザーフレンドリーではないことに注意してください。

于 2010-03-26T10:22:12.720 に答える
0

これはどう?

tabbedPane.addChangeListener(new ChangeListener(){

    @Override
    public void stateChanged(ChangeEvent arg0) {
        Component mCompo=tabbedPane.getSelectedComponent();
        tabbedPane.setPreferredSize(mCompo.getPreferredSize());
        BasicFrame.this.pack();
    }   
});
于 2013-12-24T04:09:20.733 に答える