2012-08-13 61 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(); 
      } 
     }); 
    } 
}