【问题标题】:Java Buffer strategy learningJava Buffer 策略学习
【发布时间】:2013-07-20 04:47:21
【问题描述】:

我正在学习在画布上使用缓冲策略,我编写了这个类,然后将其添加到另一个类的 JFrame 中。 我正在尝试绘制一个矩形,但画布是空的。控制台说

at java.awt.Component$FlipBufferStrategy.createBuffers(Unknown Source)
at java.awt.Component$FlipBufferStrategy.<init>(Unknown Source)
at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Unknown Source)
at java.awt.Component.createBufferStrategy(Unknown Source)
at java.awt.Canvas.createBufferStrategy(Unknown Source)
at java.awt.Component.createBufferStrategy(Unknown Source)
at java.awt.Canvas.createBufferStrategy(Unknown Source)
at myPanel.draw(Pannello.java:72)
at myPanel.run(Pannello.java:59)
at java.lang.Thread.run(Unknown Source)

这是代码。我已经调试了它,它进入了我所做的每一个方法。所以基本上现在我不知道为什么它没有显示我的矩形。

public class myPanel extends Canvas implements Runnable {

    //FIELDS
    private static final long serialVersionUID = 1L;
    public static int WIDTH = 1024;
    public static int HEIGHT = WIDTH / 16 * 9;
    private boolean running;
    private Thread t1;





    public synchronized void start (){
        running = true;
        t1 = new Thread (this);
        t1.start(); // calls run()

        }


    //INIT
    public myPanel(){

        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        setFocusable(true);
        requestFocus();
    }


    //Main runnable

    public void run(){
        while (running){   
           update();
           draw();
        }
    }


    public void update(){

    }


    public void draw(){
       BufferStrategy bs = getBufferStrategy();
       if (bs== null){
       createBufferStrategy(3);
       }

       Graphics g = bs.getDrawGraphics();
       g.setColor(Color.BLACK);
       g.fillOval(0, 0, 20, 20);
       g.dispose();
       bs.show();
    }

}

【问题讨论】:

  • 您能展示一下您的 JFrame 课程吗?

标签: java canvas graphics awt bufferstrategy


【解决方案1】:

这是我的初步答案,这应该可以解决您的问题。我将在下一次编辑中解释您的错误:

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;

public class myPanel extends Canvas implements Runnable {

//FIELDS
private static final long serialVersionUID = 1L;
public static int WIDTH = 1024;
public static int HEIGHT = WIDTH / 16 * 9;
private JFrame frame;
private boolean running;
private Thread t1;


public myPanel(){
    Dimension size = new Dimension(WIDTH, HEIGHT);

    setPreferredSize(size);

    frame = new JFrame();
}


public synchronized void start (){
    running = true;
    t1 = new Thread (this);
    t1.start(); // calls run()
}


//Main runnable

public void run(){
    while (running){   
       update();
       draw();
    }
}


public void update(){

}


public void draw(){
   BufferStrategy bs = getBufferStrategy();
   if (bs== null){
   createBufferStrategy(3);
   return;
   }

   Graphics g = bs.getDrawGraphics();
   g.setColor(Color.BLACK);
   g.fillOval(0, 0, 20, 20);
   g.dispose();
   bs.show();
}

public static void main(String[] args){
    myPanel myPanel = new myPanel();

     myPanel.frame.setResizable(false);
     myPanel.frame.setTitle("My frame");
     myPanel.frame.add(myPanel);
     myPanel.frame.pack();
     myPanel.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     myPanel.frame.setLocationRelativeTo(null);
     myPanel.frame.setVisible(true);

     myPanel.start();
}
}

好的,首先,Java 中的惯例是将您的类名大写。我不是在这里做的,但我希望你能记住。

其次,您的代码中缺少一些内容。您没有创建 JFrame,也没有 main 方法,我相信您知道每个 Java 程序都需要知道从哪里开始。您还需要一个构造函数来初始化 JFrame 并设置框架的大小。

第三,创建缓冲策略后需要return;

我希望这会有所帮助。

编辑:

不要在框架中添加new myPanel(),而是添加gameframe.add(game);

【讨论】:

  • 好的,见上文。我已经在你发帖时回答了。
  • 就是亚当。谢谢。
  • 每次调用 draw() 方法时创建引用变量 bs 的实际原因是什么?
【解决方案2】:

在帧初始化器中,在你的情况下:

public myPanel() {...}

您需要调用方法“frame.addNotify()”例如:

public myPanel() {
    Dimension size = new Dimension(WIDTH, HEIGHT);
    setPreferredSize(size);
    frame = new JFrame();
    frame.addNotify();
}

然后在你的代码中,你想要包含代码:

@Override
public void addNotify() {
    super.addNotify();
}

这只是通知框架你希望这个类使用缓冲区。 当框架不知道要为请求的任务使用哪个组件的缓冲区时,您所做的是试图让框架使用缓冲区来创建图形类型缓冲区策略。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2018-02-25
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多