代码:
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);
}
}
所以我将JPanel
的首选大小设置为600乘600并打包框架,但框架的大小仍为0乘以0.
为什么会这样,我该如何解决?
答案 0 :(得分:8)
正如您所说,pack()
将尝试安排窗口,以便将每个组件的大小调整为其preferredSize。
问题在于布局管理器似乎是试图安排组件及其各自的preferredSize的布局管理器。但是,当您将布局管理器设置为null时,没有人负责。
尝试评论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);
}
}
答案 1 :(得分:2)
pack()
查询父容器的首选大小而不是子容器的大小,因此您必须使用:
setPreferredSize(new Dimension(600, 600));
另一个注意事项是致电
setLocationRelativeTo(null);
在调用pack()
来计算中心坐标之后:)
好的,只是发现那里的空布局,为什么不使用JFrame的默认BorderLayout?
答案 2 :(得分:2)
您的问题是setLayout(null)
,因为文档说的是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();
}
});
}
}