【问题标题】:BufferStrategy not working缓冲区策略不起作用
【发布时间】:2019-09-30 23:03:57
【问题描述】:

我正在尝试使用 JFrame 和画布为游戏构建简单的 gui。 Window 是一个扩展 JFrame 类的类,我正在使用 fillRect 方法来填充黑色矩形。每次我运行我的程序时,框架窗口都不是黑色的,它是默认颜色。我不知道我的代码有什么问题。

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

【问题讨论】:

  • DoubleDouble 的答案可能是正确的,但为什么我想知道 JFrame 呢?如果您只想通过 BufferStrategy 在 Canvas 上绘图,我认为您想完全绕过 Swing 及其内部机制(例如双缓冲)。否则,您不妨在 JFrame 中绘制一个 JPanel 并让 Swing 为您完成低级别的工作。我建议你使用普通的 AWT 窗口。

标签: java swing


【解决方案1】:

你的问题在这里:

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 时,代码可以工作。

【讨论】:

  • 我检查了它并删除了 t1 并使用 mc 对象来调用 start 方法,但它仍然没有显示黑色
  • 在进行上述更改后问题仍然存在@DoubleDouble
  • 渲染后 g.dispose() 没有效果 :(
  • 我按照这些教程直到没有 5 youtube.com/playlist?list=ELshNxV9QFUOo 你可以看看并告诉我哪里错了我看了 3 4 次却找不到错误
  • 我采用了您示例中的代码,将t1.start 更改为mc.start,并将每个Window 更改为JFrame,对我来说效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多