我遇到了这种布局的问题。如何使用 gridwidth 制作第三个按钮2x2?
我也想知道,如果我想将第二个按钮拉伸到两列宽,我该怎么说从哪里开始到哪里停止?当它覆盖第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);
}
}
答案 0 :(得分:0)
首先,您是否在教程中运行了演示代码?
我会尝试解释教程代码,以便您更好地理解。它演示了如何使用gridwidth
约束,以便:
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);
}
}
在上面的代码注释中,向面板添加任一标签,您将看到它停止工作,因为没有组件占据列/行的单个单元格。当我说明网格宽度相对于列中的其他组件时,我试图解释这一点。