1

我正在学习将缓冲区策略与画布一起使用,我编写了这个类,然后将其添加到另一个类的 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();
    }

}

4

2 回答 2

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

第三,你需要return;在创建缓冲策略之后。

我希望这会有所帮助。

编辑:

不要将 a 添加new myPanel()到您的框架中,game而是添加。 frame.add(game);

于 2013-07-21T09:49:01.950 回答
0

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

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

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

于 2015-01-06T15:29:31.913 回答