pack() 如何工作以及它寻找什么
How does pack() work and what does it looks for
我在处理一些代码时遇到了 pack 方法,该方法应该为 window 找到 "optimum" 大小。但是当我试图找出它时,它只是让 window 尽可能小,即使我在调用 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();
}
编辑:
显然我对你们大多数人都不清楚,因为 "duplicate" 的链接答案没有回答我的问题。疯狂的程序员确实回答了我的问题,所以谢谢你。
使用 .pack() 和 .setSize() 没有任何意义,都取决于代码中最后一个,但我推荐使用:
frame.setMinimumSize(new Dimension(x,y));
请不要忘记添加:
frame.setVisible(true);
pack
使用布局管理器 API 和 "asks" 框架的 contentPane
因为它是 preferredSize
,这允许 pack
"pack" windows 内容周围的装饰。您必须记住,windows 尺寸包括 windows 装饰,因此 800x600 的 window 将具有明显较小的可视范围
如果您将组件添加到未定义大小的框架(在 JComponent
和 JPanel
的情况下 return preferredSize
of 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
的 window,但 TestPane
将是 200x200
您可能还想查看 Laying Out Components Within a Container, Painting in AWT and Swing and Performing Custom Painting 了解更多详情
我在处理一些代码时遇到了 pack 方法,该方法应该为 window 找到 "optimum" 大小。但是当我试图找出它时,它只是让 window 尽可能小,即使我在调用 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();
}
编辑: 显然我对你们大多数人都不清楚,因为 "duplicate" 的链接答案没有回答我的问题。疯狂的程序员确实回答了我的问题,所以谢谢你。
使用 .pack() 和 .setSize() 没有任何意义,都取决于代码中最后一个,但我推荐使用:
frame.setMinimumSize(new Dimension(x,y));
请不要忘记添加:
frame.setVisible(true);
pack
使用布局管理器 API 和 "asks" 框架的 contentPane
因为它是 preferredSize
,这允许 pack
"pack" windows 内容周围的装饰。您必须记住,windows 尺寸包括 windows 装饰,因此 800x600 的 window 将具有明显较小的可视范围
如果您将组件添加到未定义大小的框架(在 JComponent
和 JPanel
的情况下 return preferredSize
of 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
的 window,但 TestPane
将是 200x200
您可能还想查看 Laying Out Components Within a Container, Painting in AWT and Swing and Performing Custom Painting 了解更多详情