Java缓存策略学习

时间:2013-07-21 09:22:15

标签: 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$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();
    }

}

2 个答案:

答案 0 :(得分:4)

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

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并设置框架的大小。

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

我希望这会有所帮助。

编辑:

而不是向您的框架添加new myPanel(),而是添加game。    frame.add(game);

答案 1 :(得分:0)

在框架初始化程序中,在您的情况下:

public myPanel() {...}

你需要调用方法&#34; frame.addNotify()&#34; e.g:

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

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

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

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