Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 来自不同类的双缓冲区?_Java - Fatal编程技术网

Java 来自不同类的双缓冲区?

Java 来自不同类的双缓冲区?,java,Java,这是在我的类中添加到JFrame的。有谁能帮我在屏幕外使用这个类从其他类中绘制图形吗?例如,拥有一个Player类(Player.java)并从该类中绘制图像和其他内容,但仍然缓冲图像,而不在im绘制的每个类中创建新的双缓冲方法 package Display; import Graphics.Player1; import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import

这是在我的类中添加到JFrame的。有谁能帮我在屏幕外使用这个类从其他类中绘制图形吗?例如,拥有一个Player类(Player.java)并从该类中绘制图像和其他内容,但仍然缓冲图像,而不在im绘制的每个类中创建新的双缓冲方法

package Display;

import Graphics.Player1;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
      import javax.swing.JPanel;



      public class DrawArea extends JPanel implements Runnable{      
    Thread drawLoop = new Thread(this);
    BufferedImage image = new BufferedImage(1000, 700, BufferedImage.TYPE_INT_RGB);
   public Graphics offScreen = image.getGraphics();

    public DrawArea() {
        setSize(1000, 700);
        drawLoop.start();

    }

    public void update(Graphics g) {
        paint(g);
    }

    public void paint(Graphics g) {
        offScreen.setColor(Color.yellow);
        offScreen.fillRect(0, 0, 1000, 700);

        g.drawImage(image, 0, 0, null);
    }

    public void run() {
        while(true) {
            repaint();
            try {
                drawLoop.sleep(90);
            } catch (InterruptedException ex) {
                Logger.getLogger(DrawArea.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

}

让你的绘图面板看起来像这样

public class DrawingPanel extends Canvas {

    public DrawingPanel(){
        setVisible(true);
    }

}
主框架

public class MyFrame extends JFrame implements Runnable{

    DrawingPanel panel;

    public MyFrame(){
        panel = new DrawingPanel();
        add(panel);
        setVisible(true);
        panel.createBufferStrategy(2);
        new Thread(this).start();
    }

    public void run(){
        BufferStrategy buffer = panel.getBufferStrategy();
        while (true){
            Graphics g = buffer.getDrawGraphics();
            render(g);
            g.dispose();
            buffer.show();
            try {
                Thread.sleep(90);
            } catch (Exception e){}
        }
    }

    public void render(Graphics g){
        // Do your drawing here
    }

    public static void main(String[] args){
        new MyFrame();
    }

}

创建一个类似这样的播放器类(您甚至可以使用其中的paint方法创建一个名为Drawable的接口):

在绘图区域中,将此添加到绘制方法中,其中玩家是玩家对象:

player.paint(g);

如果我的问题不够详细,请告诉我,因为这已经让我很恼火了。谢谢,我刚刚阅读了画布上的文档,为了清楚起见,这个图形g绘制的所有内容都会被缓冲,其他类的任何图形对象都会被缓冲吗?例如,一个作者类draw(Graphics g){g.fillrect………}等中的draw方法将被缓冲。当我尝试使用createBufferStrategy(2)“线程中的异常”thread-1“java.lang.IllegalStateException:组件必须有一个有效的对等方”运行它时,我得到了一个异常。捕获异常是否合适?谢谢,在此之前,我在更新中使用了createBufferStrategy()(图g)。但绘画仍然“闪烁”很多?有什么建议吗?他的主要问题是关于双缓冲。
player.paint(g);