使用GridBagLayout做了一个面板,结果如下:发现问题,最下面的两个按钮大小不一致,如果我想大小一致并居中如何处理啊?部分代码如下:
public class AddRoom extends JDialog implements ActionListener { HomeCadGui parentJFrame;
JButton okButton, cancelButton; public AddRoom(HomeCadGui mainFrame) {
super(mainFrame, "Add a new room", true); 
this.parentJFrame = mainFrame; Container pane = getContentPane();
pane.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints(); c.insets = new Insets(5, 5, 5, 5); JLabel title = new JLabel("请输入room信息,多个字段使用,分割");
title.setAlignmentY(Label.RIGHT);
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.gridy = 0;
c.gridwidth=2;
pane.add(title, c);


JLabel name0 = new JLabel("添加坐标:", JLabel.RIGHT);
name0.setAlignmentY(Label.RIGHT);
c.gridwidth=1;
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.gridy = 1;
pane.add(name0, c); JTextField jtf0 = new JTextField(parentJFrame.getSelectX() + ","
+ parentJFrame.getSelectY(), 8);
jtf0.setAlignmentY(LEFT_ALIGNMENT);
jtf0.setBorder(BorderFactory.createLineBorder(Color.red, 1));
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 1;
c.gridy = 1;
pane.add(jtf0, c); JLabel name = new JLabel("Room's name:", JLabel.RIGHT);
name.setAlignmentY(Label.RIGHT);
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.gridy = 2;
pane.add(name, c); JTextField name1 = new JTextField(16);
name1.setAlignmentY(LEFT_ALIGNMENT);
name1.setBorder(BorderFactory.createLineBorder(Color.red, 1));
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 1;
c.gridy = 2;
pane.add(name1, c); JLabel name3 = new JLabel("长宽高:", JLabel.RIGHT);
name3.setAlignmentY(Label.RIGHT);
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.gridy = 3;
pane.add(name3, c); JTextField jtf3 = new JTextField("10,10,10", 8);
jtf3.setAlignmentY(LEFT_ALIGNMENT);
jtf3.setBorder(BorderFactory.createLineBorder(Color.red, 1));
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 1;
c.gridy = 3;
pane.add(jtf3, c);


okButton = new JButton("OK");
c.gridx = 0;
c.gridy = 4;
pane.add(okButton, c);

cancelButton = new JButton("Cancel");
// cancelButton.
c.gridx = 1;
c.gridy = 4;

pane.add(cancelButton, c);
setContentPane(pane); }

解决方案 »

  1.   

    将2个button加入JPanel,再设置JPanel的格式
      

  2.   

    把两个按钮放一个 panel 里面好弄,
    另外,这个也行,你把 左边 label 设置成 gridWidth = 1, 右边的 text field 设置成 gridWidth = 3,
    然后左边 button 的 gridWidth=1 gridx = 1,右边的 gridWidth = 1, gridx = 2。
      

  3.   

    是我的话,我会放弃GridBagLayout而使用TableLayout,即能达到相同的要求,又能极大的简化代码
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;import layout.TableLayout;public class Test {
        public static void main(String[] args) {
            JFrame frame = new JFrame();
            
            double f = TableLayout.FILL;
            double p = TableLayout.PREFERRED;
            double[][] size = {{0.33, 0.67}, {p, p, p, p, p}};
            TableLayout layout = new TableLayout(size);
            frame.setLayout(layout);
            
            frame.add(new JLabel("请输入room信息,多个字段使用','分割"), "0,0, 1,0");
            frame.add(new JLabel("添加坐标: "), "0,1, r");
            frame.add(new JTextField(""), "1,1");
            frame.add(new JLabel("Room's name: "), "0,2, r");
            frame.add(new JTextField(""), "1,2");
            frame.add(new JLabel("长宽高: "), "0,3, r");
            frame.add(new JTextField(""), "1,3");
            
            double[][] size2 = {{f, f}, {p}};
            JPanel panel = new JPanel(new TableLayout(size2));
            panel.add(new JButton("OK"), "0,0");
            panel.add(new JButton("Cancel"), "1,0");
            frame.add(panel, "0,4, 1,4");        // ---------------------- Frame's setting ----------------------//
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(320, 180);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    }
      

  4.   

    现在主要是学习各种布局管理器,对布局管理器的选择不是属性,通过demo想尽可能的了解其用法。
    谢谢各位