pack()如何工作以及它的用途是什么

时间:2016-02-21 00:29:32

标签: java swing awt

我正在搞乱一些代码并遇到了包方法,它想要找到最佳的"窗户的大小。但是当我尝试将它尽可能地缩小时,即使我在调用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;重复"没有回答我的问题。疯狂的程序员确实回答了我的问题,谢谢你。

2 个答案:

答案 0 :(得分:2)

pack使用布局管理器API并“询问”框架的contentPanepreferredSize,这允许pack“打包”周围的窗口装饰内容。你必须记住,一个窗户大小包括窗户装饰,所以一个800x600的窗口将有一个可见的明显更小

如果您向未定义大小的框架添加组件(在JComponentJPanel的情况下返回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 ContainerPainting in AWT and SwingPerforming Custom Painting了解更多详情

答案 1 :(得分:-2)

使用.pack()和.setSize()没有意义,所有都依赖于哪一个是代码中的最后一个,但我推荐使用:

 frame.setMinimumSize(new Dimension(x,y));

请不要忘记添加:

frame.setVisible(true);