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 将具有明显较小的可视范围

如果您将组件添加到未定义大小的框架(在 JComponentJPanel 的情况下 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 了解更多详情