bufferImage没有存储新图像

时间:2017-10-01 18:02:50

标签: java

我观察一件事。

如果我在bufferImage上执行了一些操作,比如加载图像,在createGraphics()方法的帮助下绘制一些图形,在使用相同的JPEG图像恢复相同的缓冲图像变量时,它也会显示由我在之前的缓冲图像上。

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

同样的情况发生在小时线程中,getx和逻辑将提供时间和坐标。这里是Temp类

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






    }

,输出如下

enter image description here

1 个答案:

答案 0 :(得分:-1)

好的,现在我可以看到你正在尝试做什么。这里有几个问题,但随着实施的变化,其中一些问题将会消失。

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

除此之外,如果你想要一个时钟背景并且只是移动手,最好的方法是创建另一个具有透明度的空缓冲图像,在其上绘制手,然后创建背景缓冲图像的复合和手缓冲图像。这要求您只加载一次背景,然后在每次更新时重复使用它。 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);
    ...
}

或者沿着这些方向发展。