7

私がやろうとしていること

Swingでは、または同等の線形コンテナーを使用しようとしてBoxLayoutいますが、コンテナー内のアイテムが垂直方向に伸びています。私のアプリケーションの内部では、それらを垂直方向に伸ばしたくありません。

コンポーネントにpreferredSizeまたはmaximumSizeを設定できることは知っていますが、次のコードは単なる再現であり、実際にはより複雑で動的なコンポーネントのサイズをハードコーディングまたは最大化することはできません。そしてBorderLayout、そのBorderLayout.TOP位置でaを使用することはできません。これを行うと、スクロールバーが表示されないためです。そして、私はスクロールペインが必要かもしれません。


私が試したこと

そこで、「非表示のコンポーネントをフィラーとして使用する」で説明されているようfillersに、を使用しようとしましたが、機能しません。Oracleのドキュメントにはありますが、まさに私が必要としていたもののようです。これが私の試みです:BoxLayout

    import javax.swing.Box;
    import javax.swing.BoxLayout;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;


    public class TestBoxLayout implements Runnable {

        public static void main(String[] args) {
            SwingUtilities.invokeLater(new TestBoxLayout());
        }

        @Override
        public void run() {
            JFrame f = new JFrame("test box layout");

            JPanel b = new JPanel();
            b.setLayout(new BoxLayout(b, BoxLayout.PAGE_AXIS));

            b.add(new JTextField("field 1"));
            b.add(new JTextField("field 2"));
            b.add(new JTextField("field 3"));
            b.add(Box.createVerticalGlue());

            f.setContentPane(b);
            f.setSize(500, 200);
            f.setVisible(true);
        }

    }

これは私が得る結果です:

フィラーが機能していない


2回目の試行

の代わりにBoxクラスを使用しようとしましJPanelBoxLayoutが、視覚的な結果はまったく同じです。これが私の2回目の試みです:

    import javax.swing.Box;
    import javax.swing.JFrame;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;


    public class TestBox implements Runnable {

        public static void main(String[] args) {
            SwingUtilities.invokeLater(new TestBox());
        }

        @Override
        public void run() {
            JFrame f = new JFrame("test box");

            Box b = Box.createVerticalBox();

            b.add(new JTextField("field 1"));
            b.add(new JTextField("field 2"));
            b.add(new JTextField("field 3"));
            b.add(Box.createVerticalGlue());

            f.setContentPane(b);
            f.setSize(500, 200);
            f.setVisible(true);
        }

    }

やりたいこと

誰かが私がそれらのフィラーを修正してそれらを機能させる方法を知っていますか?与えられたコードの修正は素晴らしいでしょう。

これは私が絵の具を使って作った絵で、結果として私が欲しいものを示しています。 期待される結果

4

3 に答える 3

2

BoxLayoutは、実行しようとしていることには適しています。最後のコンポーネントとしての接着剤インサートは問題ありません。JTextFieldsで単にsetMaximumSizeメソッドを使用しないのはなぜですか?JTextFieldsだけであなたのニーズを満たすことができるかどうかはわかりません。setMaximumSizeを使用しても機能しない場合は、各JTextFieldをJPanel内に配置してから、各JPanelでsetMaximumSizeを使用します。

于 2011-06-29T13:15:13.923 に答える
1

OPは、 sだけBoxLayoutで垂直接着剤を尊重する方法を尋ねました。JTextFieldテキストフィールドの最大の高さはから設定できますgetPreferredSize()

ただし、私の場合は、も必要JTextAreaであり、状況はさらに奇妙になります。JTextArea垂直接着剤は、の最大高さを制限していますが、残りの高さを共有しているようですJTextArea

JTextField以下のコードはsのOP問題を修正しますが、問題はJTextArea残ります(コメント部分のコメントを外すと、「面白い」動作が表示されます)。

import java.awt.Dimension;
import javax.swing.Box;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class TestBox implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new TestBox());
    }

    @Override
    public void run() {
        JFrame f = new JFrame("test box");

        Box b = Box.createVerticalBox();

        JTextField field1 = new JTextField();
        JTextField field2 = new JTextField();
        field1.setMaximumSize(new Dimension(Integer.MAX_VALUE, field1.getPreferredSize().height));
        field2.setMaximumSize(new Dimension(Integer.MAX_VALUE, field2.getPreferredSize().height));
        b.add(field1);
        b.add(field2);

//        JTextArea area = new JTextArea();
//        area.setRows(4);
//        area.setMaximumSize(new Dimension(Integer.MAX_VALUE, area.getPreferredSize().height));
//        b.add(new JScrollPane(area));

        b.add(Box.createVerticalGlue());

        f.setContentPane(b);
        f.setSize(500, 200);
        f.setVisible(true);
    }
}
于 2012-08-06T14:40:46.117 に答える
0

多くの投稿は、接着剤のサイズとコンテンツの配置に関するBoxの欠点を非難しています。これらの問題は、BoxLayoutがSizeRequirementsメソッドcalculateTiledPositionsおよびcalculateAlignedPositionsを使用することから発生します。これらのメソッドはエレガントに簡潔ですが、非常に単純であるため、結果が期待される動作と一致しないことがよくあります。

元の質問の回避策は、接着剤の推奨サイズに大きな値を設定することです。

    Box.Filler glue = (Box.Filler) Box.createVerticalGlue();
    glue.changeShape(glue.getMinimumSize(), 
           new Dimension(0, Short.MAX_VALUE),   // prefer it big
           glue.getMaximumSize());
    b.add(glue);

これは3つのJTextFieldに対して機能しますが、スクロールされたJTextAreaが追加された場合は機能しません。より一般的な解決策は、BoxのLayoutManagerをlayoutContainer()を書き換えるBoxLayoutサブクラスに設定することです。上記のメソッドの呼び出しを、ニーズにより適したコードに置き換えます。

于 2014-09-04T01:16:06.870 に答える