2012-10-15 35 views
2

我使用GridBagLayout这个布局:的Java的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<String> comboBox = new JComboBox<String>(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高度之和。这意味着,这个按钮高度在“两线”上。

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

谢谢:)

回答

3

你想用GridBagConsraints#anchor定义要对齐的组件在细胞内的位置。

要允许组件跨越细胞的数量,要使用GridBagConstraints#gridwidthGridBagConstraints#gridheight(默认为1)

enter image description here

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<String> comboBox = new JComboBox<String>(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); 
     } 
    } 
} 
+0

+1为示例中的链接图像(和[SSCCE](http:// sscce。org)当然) –

1

一些答案:

把锚unitlbl到WEST。

gbc.anchor = GridBagConstraints.WEST; 

以及unitField到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); 
4

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

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<String> comboBox = new JComboBox<String>(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而不是填充ipadx/ipady(应在组件内部或组件内部添加额外的空白区域)
+0

+1用于解释'weightx/weighty'和'fill' – MadProgrammer