Java GridBagLayout:使组件对齐到左侧

我使用GridBagLayout进行此布局:

 public class Example extends JFrame { public Example() { Border outline = BorderFactory.createLineBorder(Color.black); GridBagLayout gbl = new GridBagLayout(); GridBagConstraints gbc = new GridBagConstraints(); JPanel pane = new JPanel(gbl); gbc.weighty = 1.0; gbc.weightx = 1.0; JLabel unitLbl = new JLabel("Unit"); unitLbl.setBorder(outline); gbc.gridx = 0; gbc.gridy = 0; gbc.ipadx = 30; gbc.ipady = 10; gbl.setConstraints(unitLbl, gbc); pane.add(unitLbl); JLabel typeLbl = new JLabel("Type"); typeLbl.setBorder(outline); gbc.gridx = 0; gbc.gridy = 1; gbc.ipadx = 30; gbc.ipady = 10; gbl.setConstraints(typeLbl, gbc); pane.add(typeLbl); JTextField unitField = new JTextField(); typeLbl.setBorder(outline); gbc.gridx = 1; gbc.gridy = 0; gbc.ipadx = 30; gbc.ipady = 10; gbl.setConstraints(unitField, gbc); pane.add(unitField); String[] type = {"All", "Verb", "Noun", "Adjective"}; JComboBox comboBox = new JComboBox(type); gbc.gridx = 1; gbc.gridy = 1; gbc.ipadx = 30; gbc.ipady = 10; gbl.setConstraints(comboBox, gbc); pane.add(comboBox); add(pane, BorderLayout.CENTER); setSize(new Dimension(400, 300)); getContentPane().setBackground(Color.WHITE); setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new Example(); } }); } } 

在此示例中,运行时,似乎每个组件都位于框架的中心。 但我想要的是:

  1. 两个JLabelunitLbltypelbl )将位于帧的左侧
  2. JTextFieldJComboBox将分别位于两个JLabel的右侧,两者之间的距离很小。
  3. 此外,我想在网格的位置(3,0)添加一个新的JButton ,但这个位置的高度是两个JLabel高度的总和。 这意味着,这个按钮高度是“两行”。

如何修复此代码以实现此目标? 请帮帮我。

谢谢 :)

您希望使用GridBagConsraints#anchor来定义要将组件对齐的单元格内的位置。

要允许组件跨越多个单元格,您需要使用GridBagConstraints#gridwidthGridBagConstraints#gridheight (默认值为1)

在此处输入图像描述

 public class TestLayout09 { public static void main(String[] args) { new TestLayout09(); } public TestLayout09() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new LayoutPane()); frame.setBackground(Color.WHITE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class LayoutPane extends JPanel { public LayoutPane() { Border outline = BorderFactory.createLineBorder(Color.black); setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); // I'm not sure this really is what you want, but I may be mistaken // gbc.weighty = 1.0; // gbc.weightx = 1.0; JLabel unitLbl = new JLabel("Unit"); unitLbl.setBorder(outline); gbc.gridx = 0; gbc.gridy = 0; gbc.ipadx = 30; gbc.ipady = 10; gbc.anchor = GridBagConstraints.WEST; add(unitLbl, gbc); JLabel typeLbl = new JLabel("Type"); typeLbl.setBorder(outline); gbc.gridx = 0; gbc.gridy = 1; gbc.ipadx = 30; gbc.ipady = 10; add(typeLbl, gbc); JTextField unitField = new JTextField(); typeLbl.setBorder(outline); gbc.gridx = 1; gbc.gridy = 0; gbc.ipadx = 30; gbc.ipady = 10; gbc.anchor = GridBagConstraints.EAST; add(unitField, gbc); String[] type = {"All", "Verb", "Noun", "Adjective"}; JComboBox comboBox = new JComboBox(type); gbc.gridx = 1; gbc.gridy = 1; gbc.ipadx = 30; gbc.ipady = 10; add(comboBox, gbc); JButton btn = new JButton("Test"); gbc.gridx = 3; gbc.gridy = 0; gbc.fill = GridBagConstraints.BOTH; gbc.gridheight = 2; add(btn, gbc); } } } 

像这样的东西应该做的伎俩:

 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingUtilities; public class Example extends JFrame { public Example() { GridBagLayout gbl = new GridBagLayout(); GridBagConstraints gbc = new GridBagConstraints(); JPanel pane = new JPanel(gbl); gbc.anchor = GridBagConstraints.WEST; JLabel unitLbl = new JLabel("Unit"); gbc.gridx = 0; gbc.gridy = 0; gbc.insets = new Insets(3, 3, 3, 30); gbl.setConstraints(unitLbl, gbc); pane.add(unitLbl); JLabel typeLbl = new JLabel("Type"); gbc.gridx = 0; gbc.gridy = 1; gbl.setConstraints(typeLbl, gbc); pane.add(typeLbl); gbc.weightx = 1.0; gbc.insets = new Insets(3, 3, 3, 3); JTextField unitField = new JTextField(); gbc.gridx = 1; gbc.gridy = 0; gbc.fill = GridBagConstraints.BOTH; gbl.setConstraints(unitField, gbc); pane.add(unitField); String[] type = { "All", "Verb", "Noun", "Adjective" }; JComboBox comboBox = new JComboBox(type); gbc.gridx = 1; gbc.gridy = 1; gbc.fill = GridBagConstraints.NONE; gbl.setConstraints(comboBox, gbc); pane.add(comboBox); final JButton someButton = new JButton("Click me"); someButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(someButton, "You have clicked " + someButton.getText()); } }); gbc.gridx = 3; gbc.gridy = 0; gbc.gridheight = 2; gbc.fill = GridBagConstraints.VERTICAL; pane.add(someButton, gbc); add(pane, BorderLayout.CENTER); setSize(new Dimension(400, 300)); getContentPane().setBackground(Color.WHITE); setVisible(true); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new Example(); } }); } } 
  • 你需要适当地使用weightx/weighty (如何重新分配额外的水平/垂直空间)
  • 使用适当的fill属性(垂直/水平/两者都拉伸的组件?)
  • 使用适当的anchor属性(如果组件未拉伸,或者至少不在两个方向上,它应该在其单元格中的哪个位置)
  • 我通常更喜欢使用insets而不是padding,因此,我更喜欢使用ipadx/ipady insets (应该在组件周围或组件内部添加额外的空白)

一些答案:

将unitlbl的锚点放到WEST。

 gbc.anchor = GridBagConstraints.WEST; 

而单位的锚点到EAST。

 gbc.anchor = GridBagConstraints.EAST; 

对于按钮:

 JButton button = new JButton("Test"); gbc.fill = GridBagConstraints.VERTICAL; gbc.gridx = 3; gbc.gridy = 0; gbc.gridwidth = 1; gbc.gridheight = 2; gbc.weighty = 1; pane.add(button, gbc);