2

私はこのレイアウトを使用していますGridBagLayout:

public class Example extends JFrame {
    public Example() {
        Border outline = BorderFactory.createLineBorder(Color.black);
        GridBagLayout gbl = new GridBagLayout();
        GridBagConstraints gbc = new GridBagConstraints();
        JPanel pane = new JPanel(gbl);

        gbc.weighty = 1.0;
        gbc.weightx = 1.0;

        JLabel unitLbl = new JLabel("Unit");
        unitLbl.setBorder(outline);
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.ipadx = 30;
        gbc.ipady = 10;
        gbl.setConstraints(unitLbl, gbc);
        pane.add(unitLbl);

        JLabel typeLbl = new JLabel("Type");
        typeLbl.setBorder(outline);
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.ipadx = 30;
        gbc.ipady = 10;
        gbl.setConstraints(typeLbl, gbc);
        pane.add(typeLbl);

        JTextField unitField = new JTextField();
        typeLbl.setBorder(outline);
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.ipadx = 30;
        gbc.ipady = 10;
        gbl.setConstraints(unitField, gbc);
        pane.add(unitField);

        String[] type = {"All", "Verb", "Noun", "Adjective"};
        JComboBox<String> comboBox = new JComboBox<String>(type);
        gbc.gridx = 1;
        gbc.gridy = 1;
        gbc.ipadx = 30;
        gbc.ipady = 10;
        gbl.setConstraints(comboBox, gbc);
        pane.add(comboBox);


        add(pane, BorderLayout.CENTER);
        setSize(new Dimension(400, 300));
        getContentPane().setBackground(Color.WHITE);
        setVisible(true);
    }

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

この例では、実行すると、すべてのコンポーネントがフレームの中心にあるように見えます。しかし、私が欲しいのは:

  1. 2 つのJLabel(unitLbltypelbl) がフレームの左側に表示されます
  2. JTextFieldJComboBoxは 2 の右側にありJLabel、それぞれの間にわずかな距離があります。
  3. さらに、グリッドの位置 (3,0) に新しいものを追加したいのですJButtonが、この位置の高さは 2 つの高さの合計ですJLabel。つまり、このボタンの高さは「2 行」になっています。

この目標を達成するためにこのコードを修正するにはどうすればよいですか? 私を助けてください。

ありがとう :)

4

3 に答える 3

5

このような何かがトリックを行う必要があります:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Example extends JFrame {
    public Example() {
        GridBagLayout gbl = new GridBagLayout();
        GridBagConstraints gbc = new GridBagConstraints();
        JPanel pane = new JPanel(gbl);
        gbc.anchor = GridBagConstraints.WEST;

        JLabel unitLbl = new JLabel("Unit");
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.insets = new Insets(3, 3, 3, 30);
        gbl.setConstraints(unitLbl, gbc);
        pane.add(unitLbl);

        JLabel typeLbl = new JLabel("Type");
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbl.setConstraints(typeLbl, gbc);
        pane.add(typeLbl);

        gbc.weightx = 1.0;
        gbc.insets = new Insets(3, 3, 3, 3);

        JTextField unitField = new JTextField();
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.fill = GridBagConstraints.BOTH;
        gbl.setConstraints(unitField, gbc);
        pane.add(unitField);

        String[] type = { "All", "Verb", "Noun", "Adjective" };
        JComboBox<String> comboBox = new JComboBox<String>(type);
        gbc.gridx = 1;
        gbc.gridy = 1;
        gbc.fill = GridBagConstraints.NONE;
        gbl.setConstraints(comboBox, gbc);
        pane.add(comboBox);

        final JButton someButton = new JButton("Click me");
        someButton.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(someButton, "You have clicked " + someButton.getText());
            }
        });

        gbc.gridx = 3;
        gbc.gridy = 0;
        gbc.gridheight = 2;
        gbc.fill = GridBagConstraints.VERTICAL;
        pane.add(someButton, gbc);
        add(pane, BorderLayout.CENTER);
        setSize(new Dimension(400, 300));
        getContentPane().setBackground(Color.WHITE);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Example();
            }
        });
    }
}
  • 適切に使用する必要がありますweightx/weighty(余分な水平/垂直スペースはどのように再配分されますか)
  • 適切なfill属性を使用します(コンポーネントは垂直/水平/両方に引き伸ばされていますか?)
  • 適切なanchor属性を使用します(コンポーネントが引き伸ばされていない場合、または少なくとも両方向ではない場合、セル内のどこに配置する必要がありますか)
  • 私は通常、パディングの代わりにインセットを使用することを好みます。したがって、私はよりも好みますinsetsipadx/ipadyコンポーネントの周囲またはコンポーネントの内部に余分な空白を追加する必要があります)
于 2012-10-15T19:45:03.577 に答える
3

コンポーネントを位置合わせするセル内の位置を定義するために使用GridBagConsraints#anchorします。

コンポーネントが複数のセルにまたがることを許可するには、GridBagConstraints#gridwidthand GridBagConstraints#gridheight(デフォルトは1)を使用します。

ここに画像の説明を入力してください

public class TestLayout09 {

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

    public TestLayout09() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new LayoutPane());
                frame.setBackground(Color.WHITE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class LayoutPane extends JPanel {

        public LayoutPane() {
            Border outline = BorderFactory.createLineBorder(Color.black);
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();

            // I'm not sure this really is what you want, but I may be mistaken
//            gbc.weighty = 1.0;
//            gbc.weightx = 1.0;

            JLabel unitLbl = new JLabel("Unit");
            unitLbl.setBorder(outline);
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.ipadx = 30;
            gbc.ipady = 10;
            gbc.anchor = GridBagConstraints.WEST;
            add(unitLbl, gbc);

            JLabel typeLbl = new JLabel("Type");
            typeLbl.setBorder(outline);
            gbc.gridx = 0;
            gbc.gridy = 1;
            gbc.ipadx = 30;
            gbc.ipady = 10;
            add(typeLbl, gbc);

            JTextField unitField = new JTextField();
            typeLbl.setBorder(outline);
            gbc.gridx = 1;
            gbc.gridy = 0;
            gbc.ipadx = 30;
            gbc.ipady = 10;
            gbc.anchor = GridBagConstraints.EAST;
            add(unitField, gbc);

            String[] type = {"All", "Verb", "Noun", "Adjective"};
            JComboBox<String> comboBox = new JComboBox<String>(type);
            gbc.gridx = 1;
            gbc.gridy = 1;
            gbc.ipadx = 30;
            gbc.ipady = 10;
            add(comboBox, gbc);

            JButton btn = new JButton("Test");
            gbc.gridx = 3;
            gbc.gridy = 0;
            gbc.fill = GridBagConstraints.BOTH;
            gbc.gridheight = 2;
            add(btn, gbc);
        }
    }
}
于 2012-10-15T19:37:32.810 に答える
2

いくつかの答え:

unitlbl のアンカーを WEST に配置します。

gbc.anchor = GridBagConstraints.WEST;

そして unitField の EAST へのアンカー。

gbc.anchor = GridBagConstraints.EAST;

ボタンの場合:

JButton button = new JButton("Test");
gbc.fill = GridBagConstraints.VERTICAL;
gbc.gridx = 3;
gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.gridheight = 2;
gbc.weighty = 1;
pane.add(button, gbc);
于 2012-10-15T19:23:30.683 に答える