Java Gridbag 未对齐 - 第一行中显示的第二行中的最后一个单元格
Java Gridbag missalign - last cell in second row displayed in first row
我正在为表单使用 GB 布局。目前有两行,每行包含 6 个元素(第一行是标签,第二行是文本字段)。我的问题是应该显示在 X 5 Y 1 中的元素显示在 X 6 Y 0 中。你能指出我犯的错误吗?
public GUI() {
super("Bla");
GridBagLayout layout = new GridBagLayout();
setLayout(layout);
GridBagConstraints gbc = new GridBagConstraints();
[enter image description here][1]gbc.insets = new Insets(10,10,10,10);
Container con = getContentPane();
panel1 = new JPanel();
labBrawn = new JLabel("Brawn");
gbc.gridx = 0;
gbc.gridy = 0;
con.add(labBrawn, gbc);
labAgility = new JLabel("Agility");
gbc.gridx = 1;
gbc.gridy = 0;
con.add(labAgility, gbc);
labIntellect = new JLabel("Intellect");
gbc.gridx = 2;
gbc.gridy = 0;
con.add(labIntellect, gbc);
labCunning = new JLabel("Cunning");
gbc.gridx = 3;
gbc.gridy = 0;
con.add(labCunning, gbc);
labWillpower = new JLabel("Willpower");
gbc.gridx = 4;
gbc.gridy = 0;
con.add(labWillpower, gbc);
labPresence = new JLabel("Presence");
gbc.gridx = 5;
gbc.gridy = 0;
con.add(labPresence, gbc);
txtBrawn = new JTextField("", 2);
gbc.gridx = 0;
gbc.gridy = 1;
con.add(txtBrawn, gbc);
txtAgility = new JTextField("", 2);
gbc.gridx = 1;
gbc.gridy = 1;
con.add(txtAgility, gbc);
txtIntellect = new JTextField("", 2);
gbc.gridx = 2;
gbc.gridy = 1;
con.add(txtIntellect, gbc);
txtCunning = new JTextField("", 2);
gbc.gridx = 3;
gbc.gridy = 1;
con.add(txtCunning, gbc);
txtWillpower = new JTextField("", 2);
gbc.gridx = 4;
gbc.gridy = 1;
con.add(txtWillpower, gbc);
txtPresence = new JTextField("", 2);
gbc.gridx = 5;
gbc.gridy = 1;
con.add(txtPresence);
}
使用 GridBagLayout
你需要调用
add(Component component, Object constraints)
添加最后一个组件时您忘记了 GridBagConstraints
对象 con.add(txtPresence);
。没有它,组件将放在第一行的最后一个组件之后,因为它首先是免费的 space 它将看到不受约束(它只是使 Y=0 并用于下一个可用的 X)。如果您要在 JPanel
中添加组件 GridBagLayout
而没有 GridBagConstraints
对象,它们将被放在一行中。
记得用您的 GridBagConstraints
对象设置 weights
、fill
和 anchor
。
您还可以在 github 上查看我的 GridBagManager 存储库。它包含一个展示其工作原理的演示。不过,您应该仍然了解 GridBagLayout
的工作原理。
SSCCE:(快速修复您的代码)
public class GUI extends JFrame {
public static void main(String[] args) {
GUI gui = new GUI();
gui.setSize(600, 600);
gui.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
SwingUtilities.invokeLater(() -> {
gui.setVisible(true);
});
}
public GUI() {
super();
//those should be initialized outside
JLabel labBrawn = new JLabel("Brawn");
JLabel labAgility = new JLabel("Agility");
JLabel labIntellect = new JLabel("Intellect");
JLabel labCunning = new JLabel("Cunning");
JLabel labWillpower = new JLabel("Willpower");
JLabel labPresence = new JLabel("Presence");
JTextField txtBrawn = new JTextField("", 2);
JTextField txtAgility = new JTextField("", 2);
JTextField txtIntellect = new JTextField("", 2);
JTextField txtCunning = new JTextField("", 2);
JTextField txtWillpower = new JTextField("", 2);
JTextField txtPresence = new JTextField("", 2);
//--------------------------------------------
//here goes actual GUI
GridBagLayout gridBagLayout = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(10, 10, 10, 10);
gbc.anchor = GridBagConstraints.NORTH;
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = 1;
gbc.gridheight = 1;
JPanel dataInputPanel = new JPanel();
dataInputPanel.setLayout(gridBagLayout);
gbc.weightx = 1;
gbc.weighty = 0;
gbc.gridx = 0;
gbc.gridy = 0;
dataInputPanel.add(labBrawn, gbc);
gbc.gridx = 1;
gbc.gridy = 0;
dataInputPanel.add(labAgility, gbc);
gbc.gridx = 2;
gbc.gridy = 0;
dataInputPanel.add(labIntellect, gbc);
gbc.gridx = 3;
gbc.gridy = 0;
dataInputPanel.add(labCunning, gbc);
gbc.gridx = 4;
gbc.gridy = 0;
dataInputPanel.add(labWillpower, gbc);
gbc.gridx = 5;
gbc.gridy = 0;
dataInputPanel.add(labPresence, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
dataInputPanel.add(txtBrawn, gbc);
gbc.gridx = 1;
gbc.gridy = 1;
dataInputPanel.add(txtAgility, gbc);
gbc.gridx = 2;
gbc.gridy = 1;
dataInputPanel.add(txtIntellect, gbc);
gbc.gridx = 3;
gbc.gridy = 1;
dataInputPanel.add(txtCunning, gbc);
gbc.gridx = 4;
gbc.gridy = 1;
dataInputPanel.add(txtWillpower, gbc);
gbc.gridx = 5;
gbc.gridy = 1;
gbc.weighty = 1;
dataInputPanel.add(txtPresence, gbc);
dataInputPanel.setBackground(Color.red);
this.add(dataInputPanel, BorderLayout.NORTH);
}
}
我正在为表单使用 GB 布局。目前有两行,每行包含 6 个元素(第一行是标签,第二行是文本字段)。我的问题是应该显示在 X 5 Y 1 中的元素显示在 X 6 Y 0 中。你能指出我犯的错误吗?
public GUI() {
super("Bla");
GridBagLayout layout = new GridBagLayout();
setLayout(layout);
GridBagConstraints gbc = new GridBagConstraints();
[enter image description here][1]gbc.insets = new Insets(10,10,10,10);
Container con = getContentPane();
panel1 = new JPanel();
labBrawn = new JLabel("Brawn");
gbc.gridx = 0;
gbc.gridy = 0;
con.add(labBrawn, gbc);
labAgility = new JLabel("Agility");
gbc.gridx = 1;
gbc.gridy = 0;
con.add(labAgility, gbc);
labIntellect = new JLabel("Intellect");
gbc.gridx = 2;
gbc.gridy = 0;
con.add(labIntellect, gbc);
labCunning = new JLabel("Cunning");
gbc.gridx = 3;
gbc.gridy = 0;
con.add(labCunning, gbc);
labWillpower = new JLabel("Willpower");
gbc.gridx = 4;
gbc.gridy = 0;
con.add(labWillpower, gbc);
labPresence = new JLabel("Presence");
gbc.gridx = 5;
gbc.gridy = 0;
con.add(labPresence, gbc);
txtBrawn = new JTextField("", 2);
gbc.gridx = 0;
gbc.gridy = 1;
con.add(txtBrawn, gbc);
txtAgility = new JTextField("", 2);
gbc.gridx = 1;
gbc.gridy = 1;
con.add(txtAgility, gbc);
txtIntellect = new JTextField("", 2);
gbc.gridx = 2;
gbc.gridy = 1;
con.add(txtIntellect, gbc);
txtCunning = new JTextField("", 2);
gbc.gridx = 3;
gbc.gridy = 1;
con.add(txtCunning, gbc);
txtWillpower = new JTextField("", 2);
gbc.gridx = 4;
gbc.gridy = 1;
con.add(txtWillpower, gbc);
txtPresence = new JTextField("", 2);
gbc.gridx = 5;
gbc.gridy = 1;
con.add(txtPresence);
}
使用 GridBagLayout
你需要调用
add(Component component, Object constraints)
添加最后一个组件时您忘记了 GridBagConstraints
对象 con.add(txtPresence);
。没有它,组件将放在第一行的最后一个组件之后,因为它首先是免费的 space 它将看到不受约束(它只是使 Y=0 并用于下一个可用的 X)。如果您要在 JPanel
中添加组件 GridBagLayout
而没有 GridBagConstraints
对象,它们将被放在一行中。
记得用您的 GridBagConstraints
对象设置 weights
、fill
和 anchor
。
您还可以在 github 上查看我的 GridBagManager 存储库。它包含一个展示其工作原理的演示。不过,您应该仍然了解 GridBagLayout
的工作原理。
SSCCE:(快速修复您的代码)
public class GUI extends JFrame {
public static void main(String[] args) {
GUI gui = new GUI();
gui.setSize(600, 600);
gui.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
SwingUtilities.invokeLater(() -> {
gui.setVisible(true);
});
}
public GUI() {
super();
//those should be initialized outside
JLabel labBrawn = new JLabel("Brawn");
JLabel labAgility = new JLabel("Agility");
JLabel labIntellect = new JLabel("Intellect");
JLabel labCunning = new JLabel("Cunning");
JLabel labWillpower = new JLabel("Willpower");
JLabel labPresence = new JLabel("Presence");
JTextField txtBrawn = new JTextField("", 2);
JTextField txtAgility = new JTextField("", 2);
JTextField txtIntellect = new JTextField("", 2);
JTextField txtCunning = new JTextField("", 2);
JTextField txtWillpower = new JTextField("", 2);
JTextField txtPresence = new JTextField("", 2);
//--------------------------------------------
//here goes actual GUI
GridBagLayout gridBagLayout = new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(10, 10, 10, 10);
gbc.anchor = GridBagConstraints.NORTH;
gbc.fill = GridBagConstraints.BOTH;
gbc.gridwidth = 1;
gbc.gridheight = 1;
JPanel dataInputPanel = new JPanel();
dataInputPanel.setLayout(gridBagLayout);
gbc.weightx = 1;
gbc.weighty = 0;
gbc.gridx = 0;
gbc.gridy = 0;
dataInputPanel.add(labBrawn, gbc);
gbc.gridx = 1;
gbc.gridy = 0;
dataInputPanel.add(labAgility, gbc);
gbc.gridx = 2;
gbc.gridy = 0;
dataInputPanel.add(labIntellect, gbc);
gbc.gridx = 3;
gbc.gridy = 0;
dataInputPanel.add(labCunning, gbc);
gbc.gridx = 4;
gbc.gridy = 0;
dataInputPanel.add(labWillpower, gbc);
gbc.gridx = 5;
gbc.gridy = 0;
dataInputPanel.add(labPresence, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
dataInputPanel.add(txtBrawn, gbc);
gbc.gridx = 1;
gbc.gridy = 1;
dataInputPanel.add(txtAgility, gbc);
gbc.gridx = 2;
gbc.gridy = 1;
dataInputPanel.add(txtIntellect, gbc);
gbc.gridx = 3;
gbc.gridy = 1;
dataInputPanel.add(txtCunning, gbc);
gbc.gridx = 4;
gbc.gridy = 1;
dataInputPanel.add(txtWillpower, gbc);
gbc.gridx = 5;
gbc.gridy = 1;
gbc.weighty = 1;
dataInputPanel.add(txtPresence, gbc);
dataInputPanel.setBackground(Color.red);
this.add(dataInputPanel, BorderLayout.NORTH);
}
}