为什么Java中的JFrame窗口大小不会产生指定窗口大小的效果?

7
我现在只是随便玩玩尝试制作游戏,但我之前也遇到过这个问题。当我指定特定的窗口大小(比如1024 x 768)时,生成的窗口比我指定的要大一点。非常烦人。这是为什么呢?我该如何纠正它,使创建的窗口实际上是我想要的大小,而不是稍微大一点?到目前为止,我总是回去手动调整大小,每次调整几个像素,直到我得到我想要的结果,但这已经变得很老了。如果有一个公式可以告诉我需要从我的变量中添加/减去多少像素,那就太好了!
附注:我不知道我的操作系统是否会对此产生影响,但我正在使用W7X64。
private int windowWidth = 1024;
private int windowHeight = 768;

public SomeWindow() {
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setSize(windowWidth, windowHeight);
    this.setResizable(false);
    this.setLocation(0,0);
    this.setVisible(true);
}
2个回答

8
我希望Windows创建的总框架大小能够精确地符合我指定的大小。
我不理解你的问题。请发布一个展示问题的SSCCE
如果我运行以下代码:
frame.setResizable(false);
frame.setSize(1024, 768);
frame.setVisible(true);
System.out.println(frame.getSize());

它显示的是java.awt.Dimension[width=1024,height=768],这不是你期望的吗?

如果有一个公式可以告诉我需要增加/减少多少像素来调整我的变量,那就太好了!

也许你指的是标题栏和边框占用的空间?

import java.awt.*;
import javax.swing.*;

public class FrameInfo
{
    public static void main(String[] args)
    {
        GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
        Rectangle bounds = env.getMaximumWindowBounds();
        System.out.println("Screen Bounds: " + bounds );

        GraphicsDevice screen = env.getDefaultScreenDevice();
        GraphicsConfiguration config = screen.getDefaultConfiguration();
        System.out.println("Screen Size  : " + config.getBounds());

        JFrame frame = new JFrame("Frame Info");
        System.out.println("Frame Insets : " + frame.getInsets() );

        frame.setSize(200, 200);
        System.out.println("Frame Insets : " + frame.getInsets() );
        frame.setVisible( true );

        System.out.println("Frame Size   : " + frame.getSize() );
        System.out.println("Frame Insets : " + frame.getInsets() );
        System.out.println("Content Size : " + frame.getContentPane().getSize() );
     }
}

我使用了这段代码,它告诉我W7为其创建的框架确实是我指定的大小,但仍比我的1024 x 768显示器大几个像素。我有3个显示器(一个1920 x 1080和两个1024 x 768),我注意到即使我已经指定了setLocation(0,0),在我的主显示器上创建的窗口仍然向左边的显示器移动了几个像素。很烦人,但我想这就是W7的工作方式。我看不到除了处理它或者逐渐调整数字以获得所需结果之外的其他选项。camickr赢了...(帮助纠正过去的错误)。 - ubiquibacon
1
也许你会发现 frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 更好的选择?这样你就不必担心手动指定大小了。 - camickr
那也听起来是一个不错的主意。有没有办法在使用该方法的同时指定不希望框架超过一定大小呢?例如,如果我在我的设置上使用了该方法,生成的窗口会填满我的主显示器,分辨率为1920 x 1080,我不想创建的窗口比1280 x 1024更大。我会仔细阅读API,并看看能想出什么。请包容我,Camickr,随着我学习编程,会有很多问题需要问。如果我使用了错误的术语,请纠正我。感谢您的帮助。 - ubiquibacon
frame.setMaximizedBounds(...); - camickr

1

当您说获得的窗口大小不是所要求的大小时,您是指带有装饰的窗口吗?

实际上,窗口大小是在没有特定于操作系统的窗口装饰的情况下定义的。

请尝试添加

this.setUndecorated(true);

之前
this.setVisible(true);

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