我正在尝试编写我认为应该易于指定的对话框,我在它们的对面有一些标签和一些文本区域,然后有一个“确定”和“取消”按钮。
在中间,我有一个广泛的组成部分(例如,我使用了一个标签)

 |label|  [combo box]
 |label|  [txtfield]
 |label|  [txtfield]
 |  long label here |


 [btn1]      [btn2]

我正在尝试使用GridBagLayout,它没有按照我想要的去做,而且我不确定我为什么会这样。基本上,我希望按钮固定在对话框的底部。

下面的代码介绍了我的使用方式:
package gui;

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;

public class GridBagLayoutExample2 extends JFrame {

    private static final long serialVersionUID = -1972347726217162551L;
    final private JLabel lbl1 = new JLabel("LABEL1: ");
    final private JLabel lbl2 = new JLabel("LABEL2: ");
    final private JLabel lbl3 = new JLabel("LABEL3: ");
    final private JTextArea txt1 = new JTextArea(" ");
    final private JComboBox cmb1 = new JComboBox();
    final private JTextArea txt2 = new JTextArea("");
    final private JLabel lblLine = new JLabel("a compenent on all the line");
    final private JButton btnOK = new JButton("OK");
    final private JButton btnCancel = new JButton("Cancel");

    public GridBagLayoutExample2() {

        GridBagLayout bl = new GridBagLayout();
        Container pane = getContentPane();
        pane.setLayout(bl);
        GridBagConstraints c = new GridBagConstraints();
        int r = 0;

        placeComponentInGridBagLayout(lbl1, pane, bl, c, 0, r, null, null, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, null, null, null, null);
        placeComponentInGridBagLayout(cmb1, pane, bl, c, 1, r++, null, null, GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, null, null, null, null);
        placeComponentInGridBagLayout(lbl2, pane, bl, c, 0, r, null, null, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, null, null, null, null);
        placeComponentInGridBagLayout(txt2, pane, bl, c, 1, r++, null, null, GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, null, null, null, null);
        placeComponentInGridBagLayout(lbl3, pane, bl, c, 0, r, null, null, GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, null, null, null, null);
        placeComponentInGridBagLayout(txt1, pane, bl, c, 1, r++, null, null, GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, null, null, null, null);
        placeComponentInGridBagLayout(lblLine, pane, bl, c, 0, r++, null, null, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, 2, null, null, null);
        placeComponentInGridBagLayout(btnOK, pane, bl, c, 0, null, null, null, GridBagConstraints.PAGE_END, GridBagConstraints.HORIZONTAL, null, null, null, null);
        placeComponentInGridBagLayout(btnCancel, pane, bl, c, 1, null, null, null, GridBagConstraints.PAGE_END, GridBagConstraints.HORIZONTAL, null, null, null, null);

        setSize(new Dimension(850, 350));
        pack();
        setVisible(true);
    }

    public static void placeComponentInGridBagLayout(Component component, Container container, GridBagLayout bagLayout, GridBagConstraints c, Integer gridX, Integer gridY, Double weightX, Double weightY, Integer anchor, Integer fill, Integer ipadx, Integer ipady,
            Integer gridWidth, Integer gridHeight) {
        if (c == null) {
            c = new GridBagConstraints();
        }
        if (gridX != null) {
            c.gridx = gridX;
        }
        if (gridY != null) {
            c.gridy = gridY;
        }
        if (weightX != null) {
            c.weightx = weightX;
        }
        if (weightY != null) {
            c.weighty = weightY;
        }
        if (fill != null) {
            c.fill = fill;
        }
        if (anchor != null) {
            c.anchor = anchor;
        }
        if (ipadx != null) {
            c.ipadx = ipadx;
        }
        if (ipady != null) {
            c.ipady = ipady;
        }
        if (gridWidth != null) {
            c.gridwidth = gridWidth;
        }
        if (gridHeight != null) {
            c.gridheight = gridHeight;
        }
        bagLayout.setConstraints(component, c);

        container.add(component);
    }

}

知道我在做什么错吗?
还有在Swing中实现同一目标的更现代的方法吗?

谢谢

最佳答案

当做一个简单的表单时,SpringLayout是一个有用的布局管理器。为了将组件打包在一行中,使用BoxLayout很有用。

这是一个简单的示例:

这是代码:

public class LayoutDemo extends JFrame {

    public LayoutDemo() {

        JLabel label1 = new JLabel("label 1");
        JLabel label2 = new JLabel("label 2");
        JLabel label3 = new JLabel("label 3");
        JComboBox<String> combobox = new JComboBox<>();
        JTextField field1 = new JTextField();
        JTextField field2 = new JTextField();

        JPanel formPanel = new JPanel(new SpringLayout());
        formPanel.add(label1);
        formPanel.add(combobox);
        formPanel.add(label2);
        formPanel.add(field1);
        formPanel.add(label3);
        formPanel.add(field2);

        SpringUtilities.makeCompactGrid(formPanel, 3, 2, 2, 2, 3, 3);

        JLabel longLabel = new JLabel("This is a longer label");
        longLabel.setAlignmentX(CENTER_ALIGNMENT);

        JButton button1 = new JButton("Button 1");
        JButton button2 = new JButton("Button 2");

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.LINE_AXIS));
        buttonPanel.add(button1);
        buttonPanel.add(Box.createHorizontalGlue());
        buttonPanel.add(button2);

        JPanel basePanel = new JPanel();
        basePanel.setLayout(new BoxLayout(basePanel, BoxLayout.PAGE_AXIS));
        basePanel.add(formPanel);
        basePanel.add(longLabel);

        add(basePanel, BorderLayout.NORTH);
        add(buttonPanel, BorderLayout.SOUTH);
        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

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

您可能需要使用BorderLayout例如调整窗口大小时,将formPanel保持在顶部,而不会拉伸。但是我希望我为您提供了一些有关如何将SpringLayout用于表单的想法。

10-05 22:21