19

これまではGridBagLayout(手書きのコードで)なるべく使わないようにしていましたが、今回はどうしても避けられず、SUNのチュートリアルGridBagLayoutを読んでいるのですが、今の ところうまくいきません。私は何かを誤解していると思います。
たとえば、次のコードを試してみます (SUN の投稿にあるものと似ています)。

public class MainFrame extends JFrame { 


    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MainFrame frame = new MainFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame
     */
    public MainFrame() {
        super();
        setBounds(100, 100, 500, 375);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container mainContainer = getContentPane();

        mainContainer.setLayout(new GridBagLayout());       

        //add label
        JLabel someLabel = new JLabel("Label 1:");
        GridBagConstraints constraints = new GridBagConstraints();

        constraints.gridx = 0;
        constraints.gridy = 0;
        //constraints.anchor = GridBagConstraints.FIRST_LINE_START;
        //constraints.weightx = 0.5;
        mainContainer.add(someLabel, constraints);      

        JTextField someText = new JTextField(30);

        constraints = new GridBagConstraints();

        constraints.gridx = 1;
        constraints.gridy = 0;
        constraints.weightx = 0.5;
        mainContainer.add(someText, constraints);

        //
    }

}

フレームの中央にラベルとテキストフィールドを並べて表示します。
しかし、ラベルの gridx と gridy が 0 であるため、左上隅に表示されることを期待していました。同じ結果
を設定しても。 私はここで間違っていますか? SUN の投稿から: constraints.anchor = GridBagConstraints.FIRST_LINE_START;

コンポーネントの左上の行と列を指定します。一番左の列にはアドレス gridx=0 があり、一番上の行にはアドレス gridy=0 があります。

4

5 に答える 5

16

constraints.weighty = 1;JLabel 制約とconstraints.anchor = GridBagConstraints.NORTHWEST;TextField 制約に追加します。

編集:

Oracle のGridBagLayout ガイドから:

数値が大きいほど、コンポーネントの行または列により多くのスペースが必要であることを示します。各列の重みは、その列内のコンポーネントに指定された最大の weightx に関連し、各複数列コンポーネントの重みは、コンポーネントが含まれる列間で何らかの方法で分割されます。同様に、各行の重みは、その行内のコンポーネント。余分なスペースは、一番右の列と一番下の行に行く傾向があります。

于 2011-09-01T19:28:43.270 に答える
14

weightX/weightYSwing チュートリアルで、次のように記載されているセクションを読む必要があります。

weightx または weighty にゼロ以外の値を少なくとも 1 つ指定しない限り、すべてのコンポーネントがコンテナーの中央に集まります。

weightX を指定しましたが、weightY を指定しませんでした。

編集、思ったより複雑です。以下も指定する必要があるようです。

constraints.anchor = GridBagConstraints.FIRST_LINE_START;

重みのあるものに加えて、両方のコンポーネントに。

于 2011-09-01T19:29:15.940 に答える
3

トリックを使用してこれを実現し、行の後にダミー コンポーネントを追加し、それを拡張して垂直方向のスペースを埋めます。また、制約を再利用できます。新しいオブジェクトを作成する必要はありません。

編集:トリックを忘れてください:(正しい方法は、デオン・ボタとベンコールが言ったように、アンカーを使用してコードを更新しました

この回答を受け入れないでください。デオンまたはベンのいずれかを受け入れてください

public class MainFrame extends JFrame { 
    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MainFrame frame = new MainFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

public MainFrame() {
    super();
    setBounds(100, 100, 500, 375);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Container mainContainer = getContentPane();
    mainContainer.setLayout(new GridBagLayout());       

    JLabel someLabel = new JLabel("Label 1:");
    JTextField someText = new JTextField(30);

    GridBagConstraints constraints = new GridBagConstraints();
    constraints.anchor = GridBagConstraints.FIRST_LINE_START;

    constraints.gridx = 0;
    constraints.gridy = 0;    
    constraints.weightx = 1.0;
    mainContainer.add(someLabel, constraints);      

    constraints.gridx = 1;                       
    constraints.weightx = 1.0;
    constraints.weighty = 1.0;        
    mainContainer.add(someText, constraints);                       
}
}
于 2011-09-01T19:24:42.923 に答える
1

私はあなたの質問に直接答えていないかもしれませんが、IDEを使ってレイアウトを試してみてください。私は個人的にNetbeansを提案します。そこでドラッグアンドドロップして、プロパティを確認できます。最初は、プロパティインスペクターでいくつかのデフォルト値が指定されているため、自動生成されたコードは少なくなります。しかし、レイアウトを試してみると、コードを確認して、自分が何をしているのかをよく理解できます。

于 2011-09-01T19:25:59.697 に答える