我观察一件事。
如果我在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)));
}
}
,输出如下
答案 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);
...
}
或者沿着这些方向发展。