web-dev-qa-db-ja.com

GridBagLayoutがコンポーネントを隅に配置するのではなく、中央に配置するのはなぜですか?

これまでのところ、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);

        //
    }

}

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

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

16
Cratylus

追加 constraints.weighty = 1;をJLabel制約におよびconstraints.anchor = GridBagConstraints.NORTHWEST;TextField制約に。

編集:

Oracleの GridBagLayoutガイド から:

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

13
BenCole

weightX/weightYのセクションについては、Swingチュートリアルでさらに詳しく読む必要があります。

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

WeightXを指定しましたが、weightYは指定していません。

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

constraints.anchor = GridBagConstraints.FIRST_LINE_START;

重量に加えて両方のコンポーネントのために。

13
camickr

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

編集:わかりました、トリックを忘れてください:(正しい方法は、Deon BothaとBenColeが言ったように、アンカーを使用してコードを更新しました

お願いしますしないでくださいこの答えを受け入れてください、デオンまたはベンのどちらかを受け入れてください

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);                       
}
}
3
eon

これは私のために働いた:

public class NewJFrame extends javax.swing.JFrame {

    public NewJFrame() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    private void initComponents() {
        Java.awt.GridBagConstraints gridBagConstraints;

        jPanel2 = new javax.swing.JPanel();
        jComboBox3 = new javax.swing.JComboBox();
        jComboBox4 = new javax.swing.JComboBox();
        jComboBox5 = new javax.swing.JComboBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setBackground(new Java.awt.Color(255, 204, 51));
        setMinimumSize(new Java.awt.Dimension(800, 600));
        getContentPane().setLayout(null);

        jPanel2.setLayout(new Java.awt.GridBagLayout());

        jComboBox3.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        gridBagConstraints = new Java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.fill = Java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.anchor = Java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.weightx = 1.0;
        jPanel2.add(jComboBox3, gridBagConstraints);

        jComboBox4.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        gridBagConstraints = new Java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = Java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.anchor = Java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.weightx = 1.0;
        jPanel2.add(jComboBox4, gridBagConstraints);

        jComboBox5.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
        gridBagConstraints = new Java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.fill = Java.awt.GridBagConstraints.HORIZONTAL;
        gridBagConstraints.anchor = Java.awt.GridBagConstraints.NORTHWEST;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.weighty = 1.0;
        jPanel2.add(jComboBox5, gridBagConstraints);

        getContentPane().add(jPanel2);
        jPanel2.setBounds(30, 40, 150, 260);

        pack();
    }

    public static void main(String args[]) {
        Java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }

    private javax.swing.JComboBox jComboBox3;
    private javax.swing.JComboBox jComboBox4;
    private javax.swing.JComboBox jComboBox5;
    private javax.swing.JPanel jPanel2;
}
1
Ray Hulha

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

1
bragboy