我正在搞乱一些代码并遇到了包方法,它想要找到最佳的"窗户的大小。但是当我尝试将它尽可能地缩小时,即使我在调用pack()之前画了一个圆圈。这是为什么? pack()寻找什么元素?我经常发现使用pack()和setSize()的代码,Oracle明确表示不这样做。有什么意义,因为他们都设定了尺寸?
这是代码的一部分,因为我做错了什么:
public void paint(Graphics g) {
super.paint(g);
g.fillOval(x, y, 30, 30);
}
public static void main(String[] args) throws InterruptedException {
JFrame frame = new JFrame("Extreme Pong");
Game game = new Game();
frame.add(game);
frame.pack();
}
编辑: 显然,我对你们大多数人都不清楚,因为对#34;重复"没有回答我的问题。疯狂的程序员确实回答了我的问题,谢谢你。
答案 0 :(得分:2)
pack
使用布局管理器API并“询问”框架的contentPane
为preferredSize
,这允许pack
“打包”周围的窗口装饰内容。你必须记住,一个窗户大小包括窗户装饰,所以一个800x600的窗口将有一个可见的明显更小
如果您向未定义大小的框架添加组件(在JComponent
和JPanel
的情况下返回preferredSize
0x0
,则框架将为包装到尽可能小的尺寸,而不是你想要的。
所以,例如,像......
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.fillOval(10, 10, 30, 30);
g2d.dispose();
}
}
}
在我的Mac上生成200x222
的窗口,但TestPane
将为200x200
您可能还想查看Laying Out Components Within a Container,Painting in AWT and Swing和Performing Custom Painting了解更多详情
答案 1 :(得分:-2)
使用.pack()和.setSize()没有意义,所有都依赖于哪一个是代码中的最后一个,但我推荐使用:
frame.setMinimumSize(new Dimension(x,y));
请不要忘记添加:
frame.setVisible(true);