使GridBagLayout更紧凑

时间:2014-06-04 15:47:12

标签: java swing gridbaglayout

我正在尝试使用GridBagLayout完成以下操作:

该框架将收到一组"字段" (JLabel,JTextField对),我想把它们安排在类似网格的'时尚,其中一行将包含2个这样的对(JLabel1 JField1 JLabel2 JField2)。当一行包含这四个组件时,下一个组件将添加到另一行。

编辑:我希望组件从面板顶部开始

我的代码生成以下布局。我希望组件布局更紧凑(特别是垂直距离)

pic http://i59.tinypic.com/20pwj6u.png

以下是代码:

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Test extends JFrame{

private JPanel _panel;

public Test() {
    this.setDefaultCloseOperation(HIDE_ON_CLOSE);
    this.setResizable(true);
    this.setVisible(true);
    Dimension size = new Dimension(600,600);
    this.setMinimumSize(size);
    this.setSize(size);
    this.setPreferredSize(size);
    _panel = new JPanel();
    this.add(_panel);

}

public static void main(String[] args) {
    Test t = new Test();
    String[] labels = {"label1", "label2","label3","label4","label5"};
    String[] fieldValues = {"value1","value2","value3","value4","value5"};
    t.createFields(labels,fieldValues);
}

private void createFields(String[] labels, String[] fieldValues) {
    _panel.setLayout(new GridBagLayout());
    int col = 0;
    int row = -1;
    for(int i=0; i < labels.length;i++) {
        JLabel label = new JLabel(labels[i] + ":", JLabel.TRAILING);
        JTextField field = new JTextField(fieldValues[i]);
        Dimension size = new Dimension(200,30);
        field.setPreferredSize(size);
        label.setLabelFor(field);


        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weighty = 1;
        c.weightx = 1;
        c.ipadx = 0;
        c.ipady = 0;
        c.insets = new Insets(0,0,0,0);
        c.anchor = GridBagConstraints.LINE_START;
        c.gridx = col%4;
        if(i%2 == 0) row++;
        c.gridy = row;
        _panel.add(label,c);

        col++;
        c.gridx = col%4;
        _panel.add(field,c);
        col++;
    }

    this.setVisible(true);
}

2 个答案:

答案 0 :(得分:1)

如果您不介意元素位于面板中心(垂直和水平),请删除

    c.weighty = 1;
    c.weightx = 1;

来自您的代码。 如果中心位置错误,请添加

    GridBagConstraints c = new GridBagConstraints();
    c.gridx=4;
    c.gridy=labels.length;
    c.weightx=1;
    c.weighty=1;
    _panel.add(new JLabel(),c);
循环后

答案 1 :(得分:1)

如果您希望GUI具有该大小,但组件的大小紧凑,则将它们放在自己的JPanel中,使用GridBagLayout,然后将该JPanel添加到主GUI JPanel中。如果您希望组件填充宽度,那么让主JPanel使用BorderLayout,并使用JPanel BorderLayout.NORTH或.SOUTH添加您的GBL,无论您需要什么。

例如:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.*;

public class GridBagExample extends JPanel {
   private static final int PREF_W = 600;
   private static final int PREF_H = PREF_W;

   public GridBagExample() {
      super(new BorderLayout());
      add(new GridBagUsingPanel(), BorderLayout.NORTH);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("GridBagExample");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new GridBagExample());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class GridBagUsingPanel extends JPanel {
   public static final int COLUMNS = 2;
   public static final int ROWS = 3;
   private static final int TF_COLS = 10;
   private static int inset = 5;
   private static final Insets INSETS = new Insets(inset, inset, inset, inset);
   private static final Insets EXTRA_INSETS = new Insets(inset, inset, inset, 8 * inset);
   private static final int EB_GAP = 10;

   public GridBagUsingPanel() {
      super(new GridBagLayout());
      setBorder(BorderFactory.createEmptyBorder(EB_GAP, EB_GAP, EB_GAP, EB_GAP));
      for (int r = 0; r < ROWS; r++) {
         for (int c = 0; c < COLUMNS; c++) {
            addComponent(r, c);
         }
      }
   }

   private void addComponent(int r, int c) {
      int count = 1 + r * COLUMNS + c;
      JLabel label = new JLabel("label " + count);
      JTextField textField = new JTextField("value " + count, TF_COLS);

      GridBagConstraints gbc = new GridBagConstraints();
      gbc.gridx = 2 * c;
      gbc.gridy = r;
      gbc.anchor = GridBagConstraints.WEST;
      gbc.fill = GridBagConstraints.BOTH;
      gbc.gridwidth = 1;
      gbc.gridheight = 1;
      gbc.insets = INSETS;
      gbc.weightx = 0.1;
      gbc.weighty = 1.0;
      add(label, gbc);

      gbc.gridx++;
      gbc.anchor = GridBagConstraints.EAST;
      gbc.fill = GridBagConstraints.HORIZONTAL;
      gbc.weightx = 1.0;
      if (c != COLUMNS - 1) {
         gbc.insets = EXTRA_INSETS;
      }
      add(textField, gbc);
   }

}
相关问题