5

ここにSSCCEがあります:

import java.awt.Color;
import java.awt.Dimension;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class BoxLayoutTest extends JFrame {

    public BoxLayoutTest(){
        JPanel main = new JPanel();
        main.setLayout(new BoxLayout(main, BoxLayout.Y_AXIS));
        main.setBackground(Color.red);
        this.add(main);
        JPanel northPanel = new JPanel();

        JPanel middle = new JPanel();
        middle.setLayout(new BoxLayout(middle, BoxLayout.X_AXIS));
        middle.add(new JButton("FOO"));
        middle.add(Box.createHorizontalGlue());

        JPanel aPanel = new JPanel();
        aPanel.setBackground(Color.black);

            JComboBox b = new JComboBox();
    //b.setPreferredSize(new Dimension(100,16)); //uncomment this to see the layout I would like to achieve
    //b.setMaximumSize(new Dimension(100,16));
        //middle.add(b); //uncomment this line 

        middle.setBackground(Color.green);
        northPanel.setBackground(Color.blue);

        main.add(northPanel);
        main.add(middle);
        main.add(Box.createVerticalGlue());

        this.setSize(800,600);
        this.setResizable(true);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new BoxLayoutTest();
    }

}

コンポーネントで setXXXSize メソッドを使用することが間違っていることを知らなかったときに、以前に書いたいくつかのクラスをリファクタリングしようとしています。サイズ変更可能なフレームを使用して、達成したい結果は次のとおりです。

  1. northPanel は上部にとどまり、フレーム サイズの変更に応じてサイズを変更する必要があります (正常に動作するようです)。
  2. JButton を配置する緑色のパネルは、JButton の最大サイズを維持し、上の青色のパネルのすぐ下に配置する必要があります (これは、JButton をそのパネル内に配置するだけで問題なく動作します)。

緑のパネル内に JComboBox を配置すると、問題が発生します (SSCCE の行のコメントを外してみてください)。JComboBox には最大サイズが指定されていないので、フレームに合わせて伸びます。私のコードの以前の間違ったバージョンでは、JComboBox で setxxxSize メソッドを使用してサイズを制限していました (setXXXSize メソッドの行のコメントを外して確認してください)。

私の質問は次のとおりです。

  1. setXXXSize() メソッドを呼び出さずに BoxLayout を使用して同じ結果を達成することは可能ですか?
  2. はいの場合、どのように?
  3. その効果を得るために使用できる他の LayoutManager はありますか?

私を正しい方向に向けてください

4

2 に答える 2

9

JComboBox は、無制限の最大高さをレポートする際に (JTextField と同じように) 不適切な動作をします。複数の行を表示することはありません。対処法は同じです: サブクラス化し、適切な高さを返します

        JComboBox b = new JComboBox() {

            /** 
             * @inherited <p>
             */
            @Override
            public Dimension getMaximumSize() {
                Dimension max = super.getMaximumSize();
                max.height = getPreferredSize().height;
                return max;
            }

        };

楽しみのために、ここに MigLayout を使用したスニペットがあります (これは現在、私の個人的なお気に入りです :-)

    // two panels as placeholders
    JPanel northPanel = new JPanel();
    northPanel.setBackground(Color.YELLOW);
    JPanel southPanel = new JPanel();
    southPanel.setBackground(Color.YELLOW);
    // layout with two content columns
    LC layoutContraints = new LC().wrapAfter(2)
            .debug(1000);
    AC columnContraints = new AC()
    // first column pref, followed by greedy gap
            .size("pref").gap("push")
            // second
            .size("pref");
    // three rows, top/bottom growing, middle pref
    AC rowContraints = new AC()
       .grow().gap().size("pref").gap().grow();
    MigLayout layout = new MigLayout(layoutContraints, columnContraints,
            rowContraints);
    JPanel main = new JPanel(layout);
    main.setBackground(Color.WHITE);
    // add top spanning columns and growing
    main.add(northPanel, "spanx, grow");
    main.add(new JButton("FOO"));

    // well-behaved combo: max height == pref height
    JComboBox combo = new JComboBox() {

        @Override
        public Dimension getMaximumSize() {
            Dimension max = super.getMaximumSize();
            max.height = getPreferredSize().height;
            return max;
        }

    };
    // set a prototype to keep it from constantly adjusting
    combo.setPrototypeDisplayValue("somethingaslongasIwant");

    main.add(combo);
    // add top spanning columns and growing
    main.add(southPanel, "spanx, grow");
于 2011-09-28T10:47:22.610 に答える
3

jdk でレイアウト マネージャーを使用するのは簡単ではありません。それらは単純すぎて柔軟性がないか、gridbaglayout が面倒すぎます。代わりに、jgoodies フォーム レイアウトの使用を開始し、それ以来、振り返ることはありませんでした。とてもシンプルで使いやすいです。ここにリンクがあります:

http://www.jgoodies.com/freeware/forms/

必ずホワイト ペーパーを確認してください。

そして今、Eclipse のプラグインとしてフォームレイアウト用の WYSISWG エディターを提供してくれる Google もあります。これだけで、生活がずっと楽になります。

http://code.google.com/javadevtools/wbpro/palettes/swing_palette.html

于 2011-09-28T10:56:06.413 に答える