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

时间:2014-12-14 21:30:45

标签: java swing

我正在使用Java进行简单的2D游戏。我的问题是我的窗口看起来比我设置的要大。我把它设置为800 x 800,但是,正如你从我的照片中看到的那样,底部的样本矩形只有750.如果我把它放在800,它就会离开屏幕。

主要

    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);

2 个答案:

答案 0 :(得分:3)

使用JFrame.setSize(int width, int height)时,实际上设置了整个窗口的大小。这当然包括装饰和标题栏,占据了一些空间。在你的情况下,这似乎是约50像素。尝试使用getContentPane().setPreferredSize(new Dimension(800,800));来设置JFrame的内部边界。

编辑:您需要在某处调用JFrame上的pack()才能实际调整窗口大小。

答案 1 :(得分:3)

框架可能是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);

现在所有组件都将以其首选尺寸显示。

此外,类名应以大写字母开头。 "映射"应该是" Map"。看看Java API,您会注意到这一点。不要自己制定约定!