2012-08-13 62 views
5

代碼:了setPreferredSize不起作用

import java.awt.Dimension; 

import javax.swing.*; 

public class Game extends JFrame { 
    private static final long serialVersionUID = -7919358146481096788L; 
    JPanel a = new JPanel(); 
    public static void main(String[] args) { 
     new Game(); 
    } 
    private Game() { 
     setTitle("Insert name of game here"); 
     setLocationRelativeTo(null); 
     setLayout(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     a.setPreferredSize(new Dimension(600, 600)); 
     add(a); 
     pack(); 
     setVisible(true); 
    } 
} 

所以我用600集的JPanel的首選尺寸600和包裝的框架,但幀的大小仍然是0 0.

爲什麼這和我該如何解決它?

+2

參見:[?爲什麼不贊成使用在Swing空佈局(http://stackoverflow.com/questions/6592468/why-is-它皺起了眉頭,使用一個null-layout-in-swing) – 2012-08-13 17:28:27

回答

8

正如你所說,pack()會盡量讓每一個部件被重新調整到其首選大小排列窗口。

問題是,似乎佈局管理器是試圖安排組件和它們各自的preferredSizes。但是,由於您將佈局管理器設置爲空,因此沒有人負責這一點。

嘗試評論setLayout(null)行,你會看到結果。當然,對於一個完整的窗口,你將不得不選擇並設置一個有意義的LayoutManager

這工作正常,對我說:

import java.awt.Dimension; 

import javax.swing.*; 

public class Game extends JFrame { 
    private static final long serialVersionUID = -7919358146481096788L; 
    JPanel a = new JPanel(); 
    public static void main(String[] args) { 
     new Game(); 
    } 
    private Game() { 
     setTitle("Insert name of game here"); 
     setLocationRelativeTo(null); 
     //setLayout(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     a.setPreferredSize(new Dimension(600, 600)); 
     add(a); 
     pack(); 
     setVisible(true); 
    } 
} 
+0

啊,這個作品,謝謝:) – Doorknob 2012-08-13 17:23:55

2

pack()詢問了孩子的父容器的首選大小,所以你將不得不使用:

setPreferredSize(new Dimension(600, 600)); 

另一個需要注意的是調用

setLocationRelativeTo(null); 

pack()已經打電話計算中心座標:)

好吧,剛剛發現了那裏的空佈局,爲什麼不使用JFrame的默認BorderLayout?

+0

好的,謝謝你的工作,但現在無論我添加到JPanel不出現! – Doorknob 2012-08-13 17:21:01

+0

查看我的更新以上 – Reimeus 2012-08-13 17:23:34

+1

+1要求更改正在進行呼叫的順序。首先向JFrame中添加組件,以便可以實現其大小,然後將其在相對於它的大小的屏幕上的位置引導,然後將其設置爲可見。好辦法:-) – 2012-08-13 17:46:29

2

你的問題是setLayout(null),becase的文檔說的pack()

導致此窗口的大小,以沒有佈局確實

從而適合其子組件的首選大小和佈局沒有正確執行。

這似乎爲我工作的罰款:

import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Game extends JFrame { 

    JPanel panel = new JPanel(); 

    private void createAndShowGUI() { 
     setTitle("FrameDemo"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     panel.setPreferredSize(new Dimension(600, 600)); 
     add(panel); 

     //setLayout(null); //wont work with this call as pack() resizes according to layout manager 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
    } 

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

      @Override 
      public void run() { 
       new Game().createAndShowGUI(); 
      } 
     }); 
    } 
}