GridBagLayout组件放置

时间:2017-01-28 05:28:27

标签: java layout gridbaglayout

  1. 我遇到了这种布局的问题。如何使用 gridwidth 制作第三个按钮2x2?

  2. 我也想知道,如果我想将第二个按钮拉伸到两列宽,我该怎么说从哪里开始到哪里停止?当它覆盖第2列和第3列时,如何区分第1列和第2列的情况?

    public class SwingExample {
       public static void main(String[] args) {
       JFrame theFrame = new JFrame("Grid Bag Example");
       theFrame.setSize(600,400);
       theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
       JPanel thePanel = new JPanel();
       theFrame.add(thePanel);  
    
       JButton button1 = new JButton("1");  
       JButton button2 = new JButton("2");
       JButton button3 = new JButton("3");
    
       GridBagLayout gbl = new GridBagLayout();                                            
       thePanel.setLayout(gbl);
       GridBagConstraints gbc = new GridBagConstraints();
       gbc.insets = new Insets(10, 10, 10, 10);
    
       gbc.gridx = 0;
       gbc.gridy = 0;                
       thePanel.add(button1,gbc);
    
       gbc.gridx = 1;
       gbc.gridy = 1;    
       thePanel.add(button2,gbc);
    
       gbc.gridwidth = 2;
       gbc.gridheight = 2;
       gbc.fill = GridBagConstraints.HORIZONTAL;
       gbc.fill = GridBagConstraints.VERTICAL;
       gbc.gridx = 3;
       gbc.gridy = 3;
       thePanel.add(button3,gbc);
    
       theFrame.setVisible(true);   
      }
    }
    

1 个答案:

答案 0 :(得分:0)

首先,您是否在教程中运行了演示代码?

我会尝试解释教程代码,以便您更好地理解。它演示了如何使用gridwidth约束,以便:

  1. 第二行的按钮跨越3列
  2. 第三行的按钮跨越从第二列开始的2列。
  3. GridBagLayout首先需要确定包含组件的每列的宽度。因此,找到了每列的最大组件。

    现在您已知道每列中最大组件的大小,您可以通过将列宽度相加来确定第2行和第3行中按钮的大小。第2行中的按钮将添加所有3列的宽度。第3列中的按钮将仅添加最后两列的宽度。

      

    第4列中的组件与组件3的行为和跨越有什么关系

    如果希望组件跨越多个列,则其他一些行必须在该列中具有组件,以便可以确定列的宽度。仅仅因为你使用gridwidth = 2并不意味着按钮会自动加倍。

      

    gbc.gridx = 3;

    上面你不能只让第3列神奇地显示按钮3.第2列没有任何组件所以第2列的宽度为0。

      

    是否存在一些虚拟,不可见,零维度组件的技巧

    您不能使用零维组件,因为宽度/高度将为零,这意味着列/行大小也将为零。所以你可以添加一个大小的虚拟组件。例如:

    import java.awt.*;
    import javax.swing.*;
    
    public class SwingExample {
       public static void main(String[] args) {
       JFrame theFrame = new JFrame("Grid Bag Example");
       theFrame.setSize(600,400);
       theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
       JPanel thePanel = new JPanel();
       theFrame.add(thePanel);
    
       JButton button1 = new JButton("1");
       JButton button2 = new JButton("2");
       JButton button3 = new JButton("3");
    
       JLabel label1 = new JLabel();
       label1.setPreferredSize( button1.getPreferredSize() );
       JLabel label2 = new JLabel();
       label2.setPreferredSize( button1.getPreferredSize() );
    
       GridBagLayout gbl = new GridBagLayout();
       thePanel.setLayout(gbl);
       GridBagConstraints gbc = new GridBagConstraints();
       gbc.insets = new Insets(10, 10, 10, 10);
       gbc.fill = GridBagConstraints.BOTH;
    
       gbc.gridx = 0;
       gbc.gridy = 0;
       thePanel.add(button1,gbc);
    
       gbc.gridx = 1;
       gbc.gridy = 1;
       thePanel.add(button2,gbc);
    
       gbc.gridx = 2;
       gbc.gridy = 2;
       thePanel.add(label1,gbc); // dummy component
    
       gbc.gridx = 3;
       gbc.gridy = 3;
       thePanel.add(label2,gbc); // dummy component
    
       gbc.gridx = 2;
       gbc.gridy = 2;
       gbc.gridwidth = 2;
       gbc.gridheight = 2;
       thePanel.add(button3,gbc);
    
       theFrame.setVisible(true);
      }
    }
    

    在上面的代码注释中,向面板添加任一标签,您将看到它停止工作,因为没有组件占据列/行的单个单元格。当我说明网格宽度相对于列中的其他组件时,我试图解释这一点。