2

Javas GridBagLayout で問題に直面しています。

次のコードを実行します。

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Main extends JFrame{

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

    public Main(){
        add(getPanel());
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        setSize(600, 150);
    }

    private JPanel getPanel(){
        JPanel panel = new JPanel(new GridBagLayout());

        JLabel label1 = new JLabel("Label 1");
        JLabel label2 = new JLabel("Label 2");
        JLabel label3 = new JLabel("Label 3");

        JTextField area1 = new JTextField();
        JTextField area2 = new JTextField();

        JComboBox<String> box = new JComboBox<String>();
        box.addItem("One One One");
        box.addItem("Two Two Two");

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.WEST;
        gbc.insets = new Insets(10, 10, 10, 10);

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 0;
        panel.add(label1, gbc);

        gbc.gridx = 1;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        panel.add(area1, gbc);

        gbc.gridx = 2;
        gbc.weightx = 0;
        gbc.fill = GridBagConstraints.NONE;
        panel.add(label2, gbc);

        gbc.gridx = 3;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        panel.add(area2, gbc);

        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.fill = GridBagConstraints.NONE;
        gbc.weightx = 0;
        panel.add(label3, gbc);

        gbc.weightx = 1;
        gbc.gridx = 1;
        panel.add(box, gbc);

        return panel;
    }
}

次のウィンドウを生成します。

GridBagLayout スクリーンショットの問題

ただし、2 つの JTextField は同じ幅にする必要があります。

JComboBox を追加しなければ、すべて問題ありません。

ここに画像の説明を入力

私の質問は、最後のコンポーネントが前のコンポーネントのグリッド幅に影響を与えるのはなぜですか? 私にとって本当に奇妙なことは、JComboBox の長さが増加すると、右側の JTextField が小さくなることです。実際には、左側の JTextField の長さが、右側の JTextField の長さ + JComboBox の長さに等しいように見えます。2 つの長さが等しい textfields次の行に JComboBox を配置するトリックは何ですか?

前もって感謝します!

4

2 に答える 2

3

GridBagLayout 情報によると:

基本的に、GridBagLayout はコンポーネントをグリッド内の四角形 (セル) に配置し、コンポーネントの推奨サイズを使用してセルの大きさを決定します。

を追加するとJComboBox、優先サイズがJTextFields よりも大きいため、x=1 のグリッドは、優先サイズに応じて必要な場所を共有するJPanelため、の場所のより大きな割合を占めます..weightx

そのためJComboBox、gridx=2 に「プッシュ」を追加します。それを避けるために、JTextField作成時に列の数を決定できます。

JTextField area1 = new JTextField(15);
JTextField area2 = new JTextField(15);

またはプレースホルダ テキストを追加して、JTextFields の優先サイズが 0 より大きくなるようにします。

box.setPreferredSize(area1.getPreferredSize());
panel.add(box, gbc);

優先サイズが小さいため、ほとんど見えないことに気付くでしょうJComboBox。一方、パネルは両側で等しくなります。

GridBagConstraintsまた、値をリセットしない前に追加されたコンポーネントの値をコピーしないように、コンポーネントごとに new を使用することをお勧めします。

于 2013-09-06T17:13:26.533 に答える
0

最終的に変数を作成しgetPanel、リターンの前にこのコードを追加しました:

JButton button = new JButton(new AbstractAction("Debug") {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Label1: " + label1.getPreferredSize());
        System.out.println("Label2: " + label2.getPreferredSize());
        System.out.println("Label3: " + label3.getPreferredSize());
        System.out.println("Area1: " + area1.getPreferredSize());
        System.out.println("Area2: " + area2.getPreferredSize());
        System.out.println("Box: " + box.getPreferredSize());
    }
});
gbc.weightx = 0;
gbc.gridx = 3;
panel.add(button, gbc);

試してみると、JTextFieldは推奨幅が ~45 (実際の値は LAF、OS、フォントなどによって異なります)JComboBoxと報告されているのに対し、 は推奨幅が ~142 と報告されていることがわかります。を小さい値に設定することpreferredSizeで、これを解決できます。JComboBox

于 2013-09-06T16:52:47.217 に答える