2013-10-14 45 views
0

這裏是我的代碼:的JFrame不正確中心

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示例的一部分,所以我想知道如何才能讓我的框架正確地居中。

回答

3

SpringLayout沒有任何關係。窗口居中後,JFrame正在打包,這會改變其大小。簡單地顛倒這兩個電話的順序

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

謝謝。另外,我必須在包裝後手動設置我的尺寸,並且它工作正常。 –

+0

你不需要手動調整大小 - '''會考慮窗口的大小...... – Reimeus

+0

@PinkJazz,'我必須在包裝後手動設置我的尺寸 - - 那麼你仍然在做錯事。使用佈局管理器和數據包方法的要點是以所需的大小顯示所有組件。 – camickr