在循环中创建的Frame和Canvas增长大于setResizeable时指定的值(false)

时间:2015-12-10 12:45:23

标签: java swing

我刚读过这个答案https://stackoverflow.com/a/15560624/3211987但是如果我添加循环,第一个JFrame的大小就可以了,但其他的大10个像素。这是一个功能吗?或者为什么会这样?

只有在调用frame.pack()两次时,最终大小才正确。

public class TestResizableFrame {
     public static void main(String[] args) {
        for (int i = 0; i < 25; ++i)
          new TestResizableFrame();
     }

     public TestResizableFrame() {
          EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new FixedPane());
                frame.setResizable(false);
                frame.pack(); // if called twice, the size is correct
                // frame.pack(); // uncomment to get correct size 
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class FixedPane extends JPanel {

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Dimension size = getSize();
            String text = size.width + "x" + size.height;
            FontMetrics fm = g.getFontMetrics();
            int x = (getWidth()- fm.stringWidth(text)) / 2;
            int y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent();
            g.drawString(text, x, y);
            g.setColor(Color.RED);
            g.drawRect(0, 0, 199, 199);
        }

    }

}

1 个答案:

答案 0 :(得分:0)

这是一个非常有趣的问题,让我很烦恼。从做一些尝试和错误,我找到了一个对我来说似乎可靠的解决方案。

您必须在setVisible之后setResizable

之前致电pack
frame.add(new FixedPane());
frame.setResizable(false);
frame.setVisible(true);
frame.pack();

问题仍然存在为什么必须这样。没有记录这些电话的顺序。