如何使我的GUI框架更大?

时间:2010-10-04 14:41:34

标签: java canvas jframe

问题是,我无法使其成为800x600的尺寸。换句话说,当我运行程序时,框架很小,我无法用它做任何事情。

如何让框架变大?

我已经设置了首选大小并设置了画布边界。

然后是什么问题?

public class GameCanvas extends Canvas
{
    private BufferStrategy buffer = null;

    public GameCanvas() 
    {
        setBounds(0, 0, 800, 600);
        setIgnoreRepaint(true);

        addKeyListener(new KeyInputHandler());

        requestFocus();     
    }

    public void addNotify()
    { 
        super.addNotify();
        this.createBufferStrategy(2);
        buffer = this.getBufferStrategy();

        setBounds(0, 0, 800, 600);
    }
}

public class GameGuiFrame extends JFrame
{
    private JPanel panel = new JPanel();
    private GameCanvas canvas = new GameCanvas();

    public GameGuiFrame()
    {
        this.setName("My Game");

        this.pack();
        this.setResizable(false);
        this.setVisible(true);

        panel = (JPanel) this.getContentPane();
        panel.setPreferredSize(new Dimension(750,500));
        panel.setLayout(null);
        panel.add(canvas);
    }
}

public class GameManager
{
    public static void runGameLoop()
    {
        GameGuiFrame container = new GameGuiFrame();

        container.addWindowListener(new WindowAdapter() 
        {
            public void windowClosing(WindowEvent e) 
            {
                System.exit(0);
            }
        });
    }
}

public class Main
{
    public static void main(String [] args)
    {
        GameManager.runGameLoop();
    }
}

3 个答案:

答案 0 :(得分:5)

在设置内容窗格的首选大小后,尝试打包Frame

答案 1 :(得分:2)

与您的问题无关,但根据您发布的代码,您似乎已复制了一些旧的AWT代码,并尝试在Swing应用程序中使用它。

我建议你只使用Swing组件。没有必要使用带有BufferStrategy的Canvas。只需使用JPanel,默认情况下它是双缓冲的。您复制的代码段是旧的,这不是在Swing中完成的方式。

不要使用null布局。 Swing旨在与布局管理器一起使用。然后pack()方法将能够正常工作。

无需使用WindowListener来关闭框架。这些天人们只是使用:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

此外,在将组件添加到框架后,框架应该可见。

通常你应该使用Key Bindings而不是KeyListener来监听Swing应用程序中的关键事件。

我建议您查看Swing tutorial以获取有关上述概念的更多信息。

答案 2 :(得分:1)

您致电pack()会将框架(及其中的组件)设置为首选尺寸。但是,您尚未指定首选大小。我建议删除您拨打setBounds()的两个电话,并在主要方法中调用setBounds(),而不是pack()