Java 为什么我的框架比我设定的要大?

Java 为什么我的框架比我设定的要大?,java,swing,Java,Swing,我正在用Java开发一个简单的2D游戏。我的问题是,我的窗口似乎比我设置的要大。我将其设置为800 x 800,但是,正如您从我的图片中看到的,底部的示例矩形仅为750。如果我把它调到800,它就会从屏幕上消失 Main JFrame myFrame = new JFrame(); myFrame.setSize(800,800); world map = new world(); myFrame.add(map); 地图 //The only way I ca

我正在用Java开发一个简单的2D游戏。我的问题是,我的窗口似乎比我设置的要大。我将其设置为800 x 800,但是,正如您从我的图片中看到的,底部的示例矩形仅为750。如果我把它调到800,它就会从屏幕上消失

Main

    JFrame myFrame = new JFrame();
    myFrame.setSize(800,800);
    world map = new world();
    myFrame.add(map);
地图

//The only way I can get this to the bottom is setting it to 750. But my window is 800, where 
//did the extra 50 pixels go?
g2d.draw3DRect(400, 750, 29, 20, true);

当您使用
JFrame.setSize(int-width,int-height)
时,您实际上设置了整个窗口的大小。这当然包括装饰和标题栏,它们占用了一些空间。在您的例子中,这似乎是大约50像素。尝试使用
getContentPane().setPreferredSize(新维度(800800))设置JFrame的内部边界取而代之


编辑:您需要在JFrame的某个地方调用
pack()
,以便它实际调整窗口大小。

当您使用
JFrame.setSize(int-width,int-height)
时,您实际设置了整个窗口的大小。这当然包括装饰和标题栏,它们占用了一些空间。在您的例子中,这似乎是大约50像素。尝试使用
getContentPane().setPreferredSize(新维度(800800))设置JFrame的内部边界取而代之


编辑:您需要在JFrame上的某个地方调用
pack()
,以便它实际调整窗口大小。

框架可能是800 x 800,但您进行自定义绘制的面板小于此值,因为框架装饰(标题栏和边框)占用空间

查看这段代码以演示这一点:

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());
        System.out.println(Toolkit.getDefaultToolkit().getScreenSize());

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

        frame.setSize(200, 200);
//        frame.pack();
        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() );
     }
}
关键是不应该在帧上使用setSize()方法

相反,在自定义面板中,您重写
getPreferredSize()
方法以返回800 x 800,然后调用:

frame.pack();
frame.setVisible(true);
现在,所有组件都将以其首选尺寸显示


此外,类名应以大写字符开头。“地图”应该是“地图”。看看JavaAPI,您会注意到这一点。不要制定自己的惯例

框架可能是800 x 800,但进行自定义绘制的面板小于此值,因为框架装饰(标题栏和边框)占用空间

查看这段代码以演示这一点:

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());
        System.out.println(Toolkit.getDefaultToolkit().getScreenSize());

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

        frame.setSize(200, 200);
//        frame.pack();
        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() );
     }
}
关键是不应该在帧上使用setSize()方法

相反,在自定义面板中,您重写
getPreferredSize()
方法以返回800 x 800,然后调用:

frame.pack();
frame.setVisible(true);
现在,所有组件都将以其首选尺寸显示


此外,类名应以大写字符开头。“地图”应该是“地图”。看看JavaAPI,您会注意到这一点。不要制定自己的惯例

啊,好吧,那是因为。谢谢啊,好吧,那是因为。谢谢啊,我忘了边界。那是因为。谢谢啊,我忘了边界。那是因为。谢谢