문제

Here is my code:

import java.awt.Component;
import java.awt.Container;
import javax.swing.*;

public class GUIBuilder {

/**
 * Create the GUI and show it. For thread safety, this method should be
 * invoked from the event-dispatching thread.
 */
private static void createAndShowGUI() {
    String[] labels = { "Name: ", "Fax: ", "Email: ", "Address: " };
    int numPairs = labels.length;

    JPanel p = new JPanel();
    BoxLayout b = new BoxLayout(p, BoxLayout.Y_AXIS);
    p.setLayout(b);
    // Create and populate the panel.
    JPanel p2 = new JPanel(new SpringLayout());
    for (int i = 0; i < numPairs; i++) {
        JLabel l = new JLabel(labels[i], JLabel.TRAILING);
        p2.add(l);
        JTextField textField = new JTextField(10);
        l.setLabelFor(textField);
        p2.add(textField);
    }
    p.add(p2);

    // Lay out the panel.
    makeCompactGrid(p2, numPairs, 2, // rows, cols
            6, 6, // initX, initY
            6, 6); // xPad, yPad

    // Create and set up the window.
    JFrame frame = new JFrame("SpringForm");

    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Set up the content pane.
    p.setOpaque(true); // content panes must be opaque
    frame.setContentPane(p);

    JButton enter = new JButton("Enter");
    p.add(enter);

    // Display the window.
    frame.pack();
    frame.setVisible(true);


}

/* 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);
}

/**
 * Aligns the first <code>rows</code> * <code>cols</code>
 * components of <code>parent</code> in
 * a grid. Each component in a column is as wide as the maximum
 * preferred width of the components in that column;
 * height is similarly determined for each row.
 * The parent is made just big enough to fit them all.
 *
 * @param rows number of rows
 * @param cols number of columns
 * @param initialX x location to start the grid at
 * @param initialY y location to start the grid at
 * @param xPad x padding between cells
 * @param yPad y padding between cells
 */
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);
}

public static void main(String[] args) {
    // Schedule a job for the event-dispatching thread:
    // creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}
}

For some reason, my JFrame frame isn't centering properly. Could anyone know what could be wrong here? This is my first time using SpringLayout, so I wonder if it could have anything to do with this. I used part of Oracle's examples on their website, so I would like to know how could I get my frame properly centered.

도움이 되었습니까?

해결책

It's nothing to do with SpringLayout. The JFrame is being packed after the window has been centered which changes its size. Simply reverse the order of these 2 calls

frame.setLocationRelativeTo(null);
frame.pack()
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top