java - JFrame isResizable(false) 尺寸问题

标签 java swing jframe dimensions preferredsize

我打算制作一个 ContentPanel 为 600x600 的 JFrame,并且我希望 JFrame 不能调整大小。在此框内,我绘制了一个 600x600 的红色轮廓矩形,以确保在我运行程序时一切都匹配。在限制调整 JFrame 的大小之前,我通过执行以下操作来设置 JFrame 的大小:

getContentPane().setPreferredSize( new Dimension(600,600));
pack();

当我启动程序时,我的矩形边界与 JFrame 的尺寸完美契合。但是,当我将 isResizable(false) 添加到等式中时,在我的矩形的右边缘和我的矩形的底部边缘之间似乎有像素缓冲区。通过一些尝试和错误,似乎 isResizable(false) 将高度和宽度增加了 10 个像素。 (所以 contentPane 的尺寸为 590x590 + 额外的 10 是我的解决方法)

我的问题是为什么?我似乎无法在任何地方找到关于额外 10 像素的任何文档?

注意:在不修改大小的情况下制作JFrame也观察到了这种异常。如果不使其不可调整大小,则没有可观察的面板/内容 Pane ,但是当使用 isResizable(false) 时,面板/ Pane 有可见部分。

最佳答案

你是对的,将框架设置为不可抗性似乎确实会在其高度和宽度上增加 10 个像素,至于为什么,我不能说,但这似乎是更新 native 对等体的副作用,但是。 ..

您可以在调用 JFrame#setResizable 之后调用 JFrame#pack 来重置它

public class TestResizableFrame {

    public static void main(String[] args) {
        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();
                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, getWidth() - 1, getHeight() - 1);
        }

    }

}

关于java - JFrame isResizable(false) 尺寸问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13506955/

相关文章:

java - 在警告对话框后返回 JTextField 进行编辑

java - 如何解析与java不同编码的字符串

java - 了解不同版本的 Java 在 Mac OS 上的共存

java - 传入JFrame改变亮度?

java - 如何从 no-gui 类实时更新 Java Jframe 控件

java - 在 java 中创建一个稀疏的 BufferedImage

java - 由于变量不存在,单击按钮后没有输出?

java - 如何在JPanel中的特定位置绘制垂直线?

java - TableModel 中的 setValueAt 总是获取一个字符串

java - 当你在java中调用pack()时,有没有办法阻止JFrame调整大小?