2013-12-12 42 views
1

我正在尝试为使用JFrame和canvas的游戏构建简单的GUI。 Window是扩展JFrame类的类,我用fillRect方法填充黑色矩形。每次运行我的程序时,框架窗口都不是黑色,而是默认颜色。我不知道我的代码有什么问题。BufferStrategy无法正常工作

package test1; 

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferStrategy; 
import javax.swing.JFrame; 

/** 
* 
* @author sabertooth 
*/ 
public class Test1 extends Canvas implements Runnable{ 

    /** 
    * @param args the command line arguments 
    */ 
    private final static int width=600; 
    private final static int height=500; 

    private Window gui; 
    private Thread t; 
    private boolean status=false; 

    public boolean isStatus() { 
     return status; 
    } 

    public void setStatus(boolean status) { 
     this.status = status; 
    } 


    public int getWidth() { 
     return width; 
    } 

    public int getHeight() { 
     return height; 
    } 


    public static void main(String[] args) { 
     // TODO code application logic here 
     Dimension d=new Dimension(width,height); 
     Test1 mc=new Test1(); 
     mc.gui=new Window(); 
     mc.setPreferredSize(d); 
     mc.gui.setTitle("Welcome to my game"); 
     mc.gui.add(mc); 
     mc.gui.setLocationRelativeTo(null); 
     mc.gui.setVisible(true); 
     Test1 t1=new Test1(); 
     t1.start(); 

    } 

    @Override 
    public void run() { 
     while(status) 
     { 
      update(); 
      render(); 
     } 
    } 

    public void render(){ 

    } 

    public void update(){ 
     BufferStrategy bs=getBufferStrategy(); 
     if(bs==null) 
     { 
      createBufferStrategy(3); 
      return; 
     } 
     Graphics g=bs.getDrawGraphics(); 
     g.setColor(Color.BLACK); 
     g.fillRect(0, 0, getWidth(), getHeight()); 
     g.dispose(); 
     bs.show(); 
    } 


    public synchronized void start(){ 

     setStatus(true); 
     t=new Thread(this, "Game Thread"); 
     t.start(); 
    } 
} 
+0

DoubleDouble的答案可能是正确的,但为什么JFrame我想知道?如果你只想通过BufferStrategy在画布上绘制,我想你会想完全绕过Swing及其内部机制(如双缓冲)。否则,你不妨在你的JFrame中使用JPanel,并让Swing为你做低级别的东西。我建议你使用普通的AWT窗口。 – Gimby

回答

0

你的问题是在这里:

Test1 t1=new Test1(); 
t1.start(); 

您已经成立了一个名为MC的Test1并将其添加到您的窗口。然后,您创建一个新的Test1并告诉新的开始更新,即使它没有添加到任何东西。

开始MC,而不是...

mc.start(); 

您还可以在这里加入这一行有窗口扩大自身在启动时:

mc.gui.pack(); 
mc.gui.setVisible(true);//Set it above this line in main() 

代码的工作,当我做以上和使用JFrame而不是使用Window的位置。

+0

我检查并删除T1和使用MC对象调用start方法但仍然没有显示黑 –

+0

还是上面的问题进行更改@DoubleDouble –

+0

g.dispose的无影响(后继续)渲染之后:( –