java - JFrame 未正确居中

标签 java swing jframe centering springlayout

这是我的代码:

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();
        }
    });
}
}

由于某种原因,我的 JFrame frame 无法正确居中。有人知道这里可能出了什么问题吗?这是我第一次使用 SpringLayout,所以我想知道它是否与此有关。我在他们的网站上使用了Oracle的部分示例,所以我想知道如何让我的框架正确居中。

最佳答案

这与SpringLayout无关。窗口居中后,JFrame 被打包,这会改变其大小。只需颠倒这 2 个调用的顺序即可

frame.setLocationRelativeTo(null);
frame.pack()

关于java - JFrame 未正确居中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19367723/

相关文章:

java - 如何为 Google Dataflow 中的工作人员指定磁盘类型?

java - 将xml字符串转换为java对象: getting `details` as null?

java - JPanel 中的 GLCanvas 不起作用

java - BorderLayout -- 替换 BorderLayout 组件

java - 如何将 JFileChooser 标签 "Look in:"更改为 "Save in:"(不是标题)?

Java版OCaml下划线

java - 如何在 GWT 中执行多线程?

java - 从文件到 JTable

java - "Zoom"文本在约束/框内尽可能大

Java setBackground() 混淆