【发布时间】:2013-07-06 21:48:06
【问题描述】:
我的问题很奇怪,在搜索和阅读代码 40 次之后,我无法解释为什么 jpanel 和 jframe 的宽度和高度增加了 10 个像素。
代码是:
public class Game extends JPanel implements Runnable {
public static final String NAME = "ALPHA !";
public static final int WIDTH = 600, HEIGHT = 400;
public static void main(String[] args) {
Game game = new Game();
game.setMinimumSize(new Dimension(WIDTH, HEIGHT));
game.setMaximumSize(new Dimension(WIDTH, HEIGHT));
game.setPreferredSize(new Dimension(WIDTH, HEIGHT));
game.setFocusable(true);
game.requestFocusInWindow();
JFrame frame = new JFrame(NAME);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(game, BorderLayout.CENTER);
frame.pack();
frame.setResizable(false);
frame.setAlwaysOnTop(true);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
game.startGame();
}
public void startGame() {
System.out.println("w " + getWidth() + ", h " + getHeight());
new Thread(this).start();
}
}
startGame 方法中的 println 打印:
w 610, h 410
提前致谢。
【问题讨论】:
-
这是(不是很清楚)使用
setResiabled的问题,请查看this answer 了解更多详情。另外,我想到了一些事情 - 首先,不要尝试将框架的大小设置为静态大小,而是将其内容的首选大小设置为您想要的大小并让框架填充它。框架具有占用空间的边框,因此使用(例如)600x400 可能只会产生 590x395 的可用区域(或小于您指定的区域) -
@MadProgrammer 感谢您将我链接到的答案,我发现我应该在 setResizable() 之后打包。
-
不要设置顶级容器的大小。而是布局内容并致电
pack()。 -
@AndrewThompson 是的,但如果你先调用
setResizable,然后再调用pack,它仍然会为帧增加10个像素:P