Java bufferImage未存储新映像

Java bufferImage未存储新映像,java,Java,我注意到一件事 如果我在bufferImage上执行了一些操作,比如加载图像,借助createGraphics()方法绘制一些图形,在使用相同的JPEG图像还原相同的buffer image变量时,它也会显示我在前一个buffer图像上执行的绘图 class Controller { static Thread second; static Thread minutes; static Thread hour; static Logic l; static Design d; static Se

我注意到一件事

如果我在bufferImage上执行了一些操作,比如加载图像,借助createGraphics()方法绘制一些图形,在使用相同的JPEG图像还原相同的buffer image变量时,它也会显示我在前一个buffer图像上执行的绘图

class Controller {
static Thread second;
static Thread minutes;
static Thread hour;
static Logic l;
static Design d;
static SecondNiddle s;
static MinutNiddle m;
static HourNiddle h;
static BufferedImage img1 ;
Controller(){
Niddle n=new Niddle();
l=new Logic();
s=new SecondNiddle(l);
m=new MinutNiddle(l);
h=new HourNiddle(l);
d=new Design(l,n,s,m,h);
try {
img1 = ImageIO.read(new File("back1.jpg"));
} catch (IOException e) {
}


}

public static void main(String... args) throws Exception{

Controller c=new Controller();
c.myThread();
while(true){
second.start();
second.join();

Temp.setClockBackGround(img1);
minutes.start();
minutes.join();
hour.start();
hour.join();
c.myThread();
}

}

public void myThread(){
second=new Thread(s,"second");
minutes=new Thread(m,"minutes");
hour=new Thread(h,"hour");
}
在执行第二个线程操作后,如果我重置图像并在minut线程中执行以下操作

public void run(){
l.minutAngle+=6;
create(Temp.getClockBackGround().createGraphics());
}
public void create(Graphics2D g){
System.out.println(l.minutAngle);
g.setStroke(new BasicStroke(3));
g.drawLine(175,175,getX(115,l.minutAngle),getY(115,l.minutAngle));
g.dispose();
}
同样的情况也发生在hour线程中,getx和logic将提供时间和坐标

import java.awt.*;
import javax.swing.*;
import java.awt.image.*;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

class Temp{

private  static BufferedImage background;

public static void setClockBackGround(BufferedImage bg){
background=bg;
}
public static BufferedImage getClockBackGround(){
BufferedImage b=background;

return b;
}
}
第二线

    import java.awt.*;
    import javax.swing.*;
    import java.awt.image.*;

    class SecondNiddle extends JPanel implements Runnable{
    public Graphics g;
    public Logic l;
    BufferedImage bg;
    Image img1 = Toolkit.getDefaultToolkit().getImage("yourFile.gif");
    SecondNiddle(Logic l){
        this.l=l;
    setLayout( new BorderLayout() );
    setSize(358,380);   
    img1 = Toolkit.getDefaultToolkit().getImage("back.jpg");

    }

    public void run(){


    for(int i=0;i<60;i++){
    try{
    Thread.sleep(1000);
    }catch(Exception e){}
    l.secondAngle+=6;
    repaint();  
    }
    }

    public void  paintComponent(Graphics g){
    super.paintComponent(g);
    g.drawImage(Temp.getClockBackGround(),0,0,null);
    System.out.println("running the paintComonent...");
        g.drawLine(175,175,getX(155,l.secondAngle),getY(155,l.secondAngle));
    g.dispose();
    }

    public int getX(int r,float angle){

    return (int)(175+(r*Math.sin(3.1416*angle/180)));
    }


    public int getY(int r,float angle){

    return (int)(175-(r*Math.cos(3.1416*angle/180)));
    }






    }
import java.awt.*;
导入javax.swing.*;
导入java.awt.image.*;
类SecondNiddle扩展JPanel实现可运行{
公共图形g;
公共逻辑l;
缓冲图像背景;
Image img1=Toolkit.getDefaultToolkit().getImage(“yourFile.gif”);
第二名(逻辑l){
这个。l=l;
setLayout(新的BorderLayout());
设置大小(358380);
img1=Toolkit.getDefaultToolkit().getImage(“back.jpg”);
}
公开募捐{

对于(inti=0;i好的,现在我可以看到您试图做什么了。这里有几个问题,但是随着实现的改变,其中一些问题将消失

如果你想要的不仅仅是图形更新(比如这是游戏的一部分),那么你应该真正创建一个游戏循环来执行游戏逻辑,然后以固定的速率进行图形更新

除此之外,如果你想要一个时钟背景,只需移动指针,最好的方法是创建另一个透明的空缓冲图像,在上面画指针,然后创建一个背景缓冲图像和指针缓冲图像的合成。这只需要你加载背景一次,然后将其重新用于e非常更新。Psuedo代码:

public void init()
{
    ...
    BufferedImage background = ImageIO.read();
    BufferedImage foreground = new BufferedImage(background.width, 
        background.height, BufferedImage.TYPE_ARGB);
    BufferedImage composite = new BufferedImage(background.width, 
    background.height, BufferedImage.TYPE_ARGB);
    ....
}
....
public void paint()
{
    ...
    Gragphics2d g = (Graphics2d)composite.createGraphics();
    g2d.setComposite(
         AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0));
    g.drawImage(background,0,0,null);
    g.drawImage(foreground,0,0,null);
    ...
}

或者沿着这些线做一些事情。

这还不够。这是一个循环吗?你是在创建新的临时对象还是仅仅是一个对象?你用来实际绘制的代码在哪里?绘制后你对BuffereImage做了什么?试着用代码更新你的问题(使用
标记)因此,我们可以看到您在做什么。try{img=ImageIO.read(新文件(“back1.jpg”);}catch(IOException e){}Temp.setClockBackGround(img);//这里img是bufferImage,Temp是类,用一些setter和getter方法存储它。后来我执行了一些drawingh.create(Temp.getClockBackGround().createGraphics());稍后在“创建方法”中,我将处理图形。我将重新排列我的代码,并在我的问题中添加标签。请将您的代码添加到问题中。