这是我的代码:
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的部分示例,所以我想知道如何让我的框架正确居中。
答案 0 :(得分:3)
这与SpringLayout
无关。窗口居中后,JFrame
正在打包,这会改变其大小。只需颠倒这两个电话的顺序
frame.setLocationRelativeTo(null);
frame.pack()