java swing 多个JLabel和多个JTextField的对齐

java swing 多个JLabel和多个JTextField的对齐,如下图所示,把JLabel都放在一个垂直的box1中,把JTextField放在另一个垂直的box2中,然后把box1和box2放在一个水平的boxA中。可是就如下图所示,文字和文本框对不齐。“初始信息素”、“迭代次数”、“蚂蚁数量”都太下了,“期望因子beta”和“信息素残留参数rho”都太上了。

[img]http://dl2.iteye.com/upload/attachment/0099/3919/69f853cd-e296-34f5-b627-2e8aa7ecf201.png[/img]

可是如果把一行中的JLabel和JTextField添加在一个JPanel,然后再把所有的JPanel再添加在一个垂直的Box中的话,这样文本框JTextField之间就会对不齐,文字也对不齐。该怎么样处理呢?

这个可以借助SpringUtilities这个处理对齐问题
[code="java"]
import javax.swing.*;
import javax.swing.SpringLayout;
import java.awt.*;

public class SpringUtilities {

public static void printSizes(Component c) {
    System.out.println("minimumSize = " + c.getMinimumSize());
    System.out.println("preferredSize = " + c.getPreferredSize());
    System.out.println("maximumSize = " + c.getMaximumSize());
}


public static void makeGrid(Container parent,
                            int rows, int cols,
                            int initialX, int initialY,
                            int xPad, int yPad) {
    SpringLayout layout;
    try {
        layout = (SpringLayout)parent.getLayout();
    } catch (ClassCastException exc) {
        System.err.println("The first argument to makeGrid must use SpringLayout.");
        return;
    }

    Spring xPadSpring = Spring.constant(xPad);
    Spring yPadSpring = Spring.constant(yPad);
    Spring initialXSpring = Spring.constant(initialX);
    Spring initialYSpring = Spring.constant(initialY);
    int max = rows * cols;


    Spring maxWidthSpring = layout.getConstraints(parent.getComponent(0)).
                                getWidth();
    Spring maxHeightSpring = layout.getConstraints(parent.getComponent(0)).
                                getHeight();
    for (int i = 1; i < max; i++) {
        SpringLayout.Constraints cons = layout.getConstraints(
                                        parent.getComponent(i));

        maxWidthSpring = Spring.max(maxWidthSpring, cons.getWidth());
        maxHeightSpring = Spring.max(maxHeightSpring, cons.getHeight());
    }

    for (int i = 0; i < max; i++) {
        SpringLayout.Constraints cons = layout.getConstraints(
                                        parent.getComponent(i));

        cons.setWidth(maxWidthSpring);
        cons.setHeight(maxHeightSpring);
    }


    SpringLayout.Constraints lastCons = null;
    SpringLayout.Constraints lastRowCons = null;
    for (int i = 0; i < max; i++) {
        SpringLayout.Constraints cons = layout.getConstraints(
                                             parent.getComponent(i));
        if (i % cols == 0) { //start of new row
            lastRowCons = lastCons;
            cons.setX(initialXSpring);
        } else { //x position depends on previous component
            cons.setX(Spring.sum(lastCons.getConstraint(SpringLayout.EAST),
                                 xPadSpring));
        }

        if (i / cols == 0) { //first row
            cons.setY(initialYSpring);
        } else { //y position depends on previous row
            cons.setY(Spring.sum(lastRowCons.getConstraint(SpringLayout.SOUTH),
                                 yPadSpring));
        }
        lastCons = cons;
    }

    SpringLayout.Constraints pCons = layout.getConstraints(parent);
    pCons.setConstraint(SpringLayout.SOUTH,
                        Spring.sum(
                            Spring.constant(yPad),
                            lastCons.getConstraint(SpringLayout.SOUTH)));
    pCons.setConstraint(SpringLayout.EAST,
                        Spring.sum(
                            Spring.constant(xPad),
                            lastCons.getConstraint(SpringLayout.EAST)));
}

/* Used by makeCompactGrid. */
private static SpringLayout.Constraints getConstraintsForCell(
                                            int row, int col,
                                            Container parent,
                                            int cols) {
    SpringLayout layout = (SpringLayout) parent.getLayout();
    Component c = parent.getComponent(row * cols + col);
    return layout.getConstraints(c);
}


public static void makeCompactGrid(Container parent,
                                   int rows, int cols,
                                   int initialX, int initialY,
                                   int xPad, int yPad) {
    SpringLayout layout;
    try {
        layout = (SpringLayout)parent.getLayout();
    } catch (ClassCastException exc) {
        System.err.println("The first argument to makeCompactGrid must use SpringLayout.");
        return;
    }

    //Align all cells in each column and make them the same width.
    Spring x = Spring.constant(initialX);
    for (int c = 0; c < cols; c++) {
        Spring width = Spring.constant(0);
        for (int r = 0; r < rows; r++) {
            width = Spring.max(width,
                               getConstraintsForCell(r, c, parent, cols).
                                   getWidth());
        }
        for (int r = 0; r < rows; r++) {
            SpringLayout.Constraints constraints =
                    getConstraintsForCell(r, c, parent, cols);
            constraints.setX(x);
            constraints.setWidth(width);
        }
        x = Spring.sum(x, Spring.sum(width, Spring.constant(xPad)));
    }

    //Align all cells in each row and make them the same height.
    Spring y = Spring.constant(initialY);
    for (int r = 0; r < rows; r++) {
        Spring height = Spring.constant(0);
        for (int c = 0; c < cols; c++) {
            height = Spring.max(height,
                                getConstraintsForCell(r, c, parent, cols).
                                    getHeight());
        }
        for (int c = 0; c < cols; c++) {
            SpringLayout.Constraints constraints =
                    getConstraintsForCell(r, c, parent, cols);
            constraints.setY(y);
            constraints.setHeight(height);
        }
        y = Spring.sum(y, Spring.sum(height, Spring.constant(yPad)));
    }

    //Set the parent's size.
    SpringLayout.Constraints pCons = layout.getConstraints(parent);
    pCons.setConstraint(SpringLayout.SOUTH, y);
    pCons.setConstraint(SpringLayout.EAST, x);
}

}
[/code]

[b]具体用法[/b]
[code="java"]
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SpringLayout;

public class App {
private static void createAndShowGUI() {
String[] labels = { "姓名: ", "密码: ", "Email: ", "地址: " };
int numPairs = labels.length;

    JPanel p = new JPanel(new SpringLayout());
    for (int i = 0; i < numPairs; i++) {
        JLabel l = new JLabel(labels[i], JLabel.TRAILING);
        p.add(l);
        JTextField textField = new JTextField(10);
        l.setLabelFor(textField);
        p.add(textField);
    }

    SpringUtilities.makeCompactGrid(p, numPairs, 2,
            6, 6, 
            6, 6); 

    JFrame frame = new JFrame("SpringForm");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    p.setOpaque(true); 
    frame.setContentPane(p);

    frame.pack();
    frame.setVisible(true);
}

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

}

[/code]

设置layout为null 指定对象宽度,采用绝对定位画出来的界面要好看些