2010-10-04 45 views
1

问题是,我无法使它成为800x600的尺寸。换句话说,当我运行这个程序时,框架非常小,我无法做任何事情。如何让我的GUI框架更大?

如何让框架变大?

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

然后是什么问题?

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

回答

5

尝试打包您设置了内容窗格的首选大小。

1

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

2

与您的问题无关,但基于您发布的代码,它看起来像您已经复制了一些旧的AWT代码,并且正在尝试在Swing应用程序中使用它。

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

请勿使用空布局。 Swing旨在与布局经理一起使用。然后pack()方法将能够正常工作。

没有必要使用WindowListener来关闭框架。现在人们只使用:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

另外,框架应该在组件添加到框架后变为可见。

通常,您应该使用键绑定,而不是KeyListener来侦听Swing应用程序中的键事件。

我建议你看看Swing tutorial以获得更多关于上述概念的信息。