窗口大小比应该的要小

4

好的,我有一个带屏幕的JFrame。我将其大小设置为800x800。然而窗口创建的尺寸比这小。这不是任务栏的问题,因为它不是全屏。

package sharph;

import java.awt.Dimension;
import javax.swing.JFrame;

public class Main extends JFrame {

    public static String Title = "Game 1";

    public static Dimension screenSize = new Dimension(800,800);

    public static void main(String[] args) {        
        JFrame frame = new JFrame();

        frame.setTitle(Title);
        frame.setSize(screenSize);
        frame.setLocationRelativeTo(null);
        frame.setResizable(true);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);

        Screen screen = new Screen();
        screen.setSize(screenSize);

        frame.add(screen);
        frame.setVisible(true);
    }
}

在屏幕类中,绘画方法会在应该有边框的地方绘制一个框:
//Draw border
g.setColor(Color.RED);
g.drawRect(1, 1, 799, 799);

当我运行它时,窗口比框小,底部和右侧被切掉了。 请注意第二张图片我手动调整大小以显示边框差异。 我意识到我在每个侧面都画了1像素的框,但是差异远远超过2像素。

800*800是窗口装饰(框架和标题栏)的大小,而不是内部空间的大小。 - MrSmith42
我不确定,但是尝试使用 frame.pack() - MrSmith42
2个回答

6

这是因为内容需要适应框架大小减去其边框的大小。

查看此问题此问题以获取更详细的解释。

布局管理器还会覆盖您在Screen组件上设置的大小属性。在任何情况下,您都应该覆盖Screen类的getPreferredSize方法。

此外,您不应该依赖于魔术数字或对组件实际大小的假设,而应该改用getWidthgetHeight(我知道,这仅用于演示目的)。


非常感谢!是的,我会更改那些内容。 - Sharph

1

不要使用 "screen.setSize(screenSize);",而是使用 "screen.setPreferredSize(screenSize);",然后在输入 "frame.setVisible(true);" 后输入 "frame.pack()"。如果需要的话,也可以删除 "frame.setSize(screenSize);"。


通常情况下,在将框架设置为可见之前,您应该先进行打包,否则可能会导致重绘问题。 - MadProgrammer
啊,谢谢。我从来没有遇到过这样的问题,但我想其他人可能会有。 - Michael Hall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接