Java缓冲策略学习

Java缓冲策略学习,java,canvas,graphics,awt,bufferstrategy,Java,Canvas,Graphics,Awt,Bufferstrategy,我正在学习将bufferstrategy与canvas结合使用,我编写了这个类,然后将它添加到另一个类的JFrame中。 我试图画一个矩形,但画布是空的。控制台说 at java.awt.Component$FlipBufferStrategy.createBuffers(Unknown Source) at java.awt.Component$FlipBufferStrategy.<init>(Unknown Source) at java.awt.Component$FlipS

我正在学习将bufferstrategy与canvas结合使用,我编写了这个类,然后将它添加到另一个类的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)

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

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,也没有主方法,我相信您知道每个Java程序都需要知道从哪里开始。您还需要一个构造函数来初始化JFrame并设置框架的大小

第三,您需要
返回创建缓冲区策略后

我希望这有帮助

编辑:

不要在框架中添加新的myPanel()
,而是添加游戏。
frame.add(游戏)

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

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,也没有主方法,我相信您知道每个Java程序都需要知道从哪里开始。您还需要一个构造函数来初始化JFrame并设置框架的大小

第三,您需要
返回创建缓冲区策略后

我希望这有帮助

编辑:

不要在框架中添加新的myPanel()
,而是添加游戏。
frame.add(游戏)

public myPanel() {...}
您需要调用方法“frame.addNotify()”,例如:

然后,在以后的代码中,您希望包含以下代码:

@Override
public void addNotify() {
    super.addNotify();
}
这只是通知帧希望此类使用缓冲区。
您所做的是试图让帧使用缓冲区来创建图形类型缓冲策略,而帧不知道要将哪个组件的缓冲区用于请求的任务。

在帧初始值设定项中,在您的情况下:

public myPanel() {...}
您需要调用方法“frame.addNotify()”,例如:

然后,在以后的代码中,您希望包含以下代码:

@Override
public void addNotify() {
    super.addNotify();
}
这只是通知帧希望此类使用缓冲区。
您所做的是试图让帧使用缓冲区来创建图形类型缓冲策略,而帧不知道用于请求的任务的组件缓冲区。

能否显示JFrame类?能否显示JFrame类?好的,请参见上文。你发帖的时候我已经回复了,就是亚当。谢谢。每次调用draw()方法时创建引用变量bs的实际原因是什么?好的,请参见上文。你发帖的时候我已经回复了,就是亚当。谢谢。每次调用draw()方法时创建引用变量bs的实际原因是什么?