4

これはここでの最初の質問です。規則に違反していたり​​、正しい形式を使用していない場合はご容赦ください。

1つのJLabel、1つのJTextField、および1つのボタンで構成されるJavaスイングで単純なフォームを作成しています

|---------------------------|
|                           |
|           JLabel          |
|                           |
|---------------------------|
|    JTextField    | Button |
|---------------------------|

ボタンは右下隅に、JTextField はその左に、JLabel は上部に、両方の列にまたがって配置する必要があります。

Button は固定サイズ、JTextField は固定高、ただし全幅 (Button で使用されているものを除く) を使用し、JLabel は他のすべてのスペース (および高さ) を使用する必要があります。

GridBagLayout または別の Layout を使用する必要があるかどうかさえわかりません。

これはおそらく非常に簡単な質問ですが、かなり長い間戸惑いました (GridBarLayout のオプションが多すぎると思います)。

4

4 に答える 4

2

まず、パネルのレイアウトを に設定しますGridBagLayout

次に、GridBagConstraintsオブジェクトを作成し、塗りつぶしを に設定しGridBagConstraints.BOTHます。

の場合JLabel、制約オブジェクトに次のプロパティを設定しますgridx = 0, gridy = 0, gridwidth = 2, gridheight = 2, weightx = 1, weighty = 1

の場合JTextField、制約オブジェクトに次のプロパティを設定しますgridx = 0, gridy = 1, gridwidth = 1, gridheight = 1, weightx = 1, weighty = 0

の場合JButton、制約オブジェクトに次のプロパティを設定しますgridx = 1, gridy = 1, gridwidth = 1, gridheight = 1, weightx = 0, weighty = 0

于 2012-11-06T14:32:39.263 に答える
2

クラス BorderLayout は使いやすく、GridBagLayout ほど強力ではありません。

しかし、物事が単純な場合、解決策は同じでなければなりません。

panel.add( label, BorderLayout.CENTER );
JPanel south = new JPanel();
south.add( textfield );
south.add( button );
button.setPreferredSize( x, y );
panel.add( south, BorderLayout.SOUTH );
于 2012-11-06T14:33:42.003 に答える
1

OK、これがデモコードです。

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class TestGridBagLayout {

    protected void initUI() {
        JFrame frame = new JFrame(TestGridBagLayout.class.getSimpleName());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JButton button = new JButton("A button");
        JTextField textField = new JTextField();
        JLabel label = new JLabel("A cool long nice label that will stretch.");
        label.setHorizontalAlignment(JLabel.CENTER);
        label.setBorder(BorderFactory.createLineBorder(Color.GREEN));
        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.fill = GridBagConstraints.BOTH;// Fill the "cell" in both direction
        gbc.weightx = 1.0;// Allocate extra-width to the label
        gbc.weighty = 1.0;// Allocate extra-height to the label
        gbc.gridwidth = GridBagConstraints.REMAINDER;// The label takes all the available width of the "row"
        panel.add(label, gbc);

        gbc.weighty = 0; // Don't stretch TF vertically
        gbc.fill = GridBagConstraints.HORIZONTAL; // Fill horizontally
        gbc.gridwidth = GridBagConstraints.RELATIVE;
        panel.add(textField, gbc);
        gbc.weightx = 0; // No extra horizontal space is given to the button
        gbc.fill = GridBagConstraints.NONE; // No fill for the button
        panel.add(button, gbc);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestGridBagLayout().initUI();
            }
        });
    }

}
于 2012-11-06T15:29:35.117 に答える
1

これがよくあることかどうかはわかりませんが、以下は動作しているコードです (主に Dan と Guillaume のコード)。

    //show stuff
    setLayout(new GridBagLayout());
    GridBagConstraints c = new GridBagConstraints();
    //show label
    c.fill = GridBagConstraints.BOTH;           // Fill the "cell" in both direction
    c.weightx = 1.0;                            // Allocate extra-width to the label
    c.weighty = 1.0;                            // Allocate extra-height to the label
    c.gridwidth = GridBagConstraints.REMAINDER; // The label takes all the available width of the "row"
    add(mlblShow,c);
    //show cmd txt
    c.weighty = 0;                              // Don't stretch TF vertically
c.fill = GridBagConstraints.BOTH;           // Fill horizontally and vertically
c.gridwidth = GridBagConstraints.RELATIVE;
    add(mtxtCmd,c);
    //show send button
     c.weightx = 0;                             // No extra horizontal space is given to the button
 c.fill = GridBagConstraints.NONE;          // No fill for the button
    add(cmdSend,c);
于 2012-11-06T16:00:08.633 に答える