2011-09-06 107 views
0

我正在制作一个模拟时钟,我遇到了一个我无法解决的问题。Java - 类之间的通信 - 问题

我有三个类:主,时钟,指针。 主要只是创建时钟,并启动一切。 时钟管理时钟如何工作和绘制。 指针定义了指针的功能。

时钟创建三个不同的图像和速度指针。 在指针类中,定时器以参数速度启动。

根据速度(即它是什么指针),指针角度将增加。 时钟获取绘画时的角度。

我的问题是,我不能让指针对象告诉时钟何时执行一个操作,以便它可以更新和重新绘制?怎么解决?我不能从指针创建一个新的时钟对象,因为我得到了大量的错误。

请帮忙!

Here's的代码:(忽略在时钟周期()方法)

主:

import javax.swing.JFrame; 

public class Main extends JFrame { 



    public Main(){ 
     add(new Clock()); 
     setTitle("Klocka"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(400,400); 
     setVisible(true); 
     setLocationRelativeTo(null); 
     setResizable(false); 
    } 

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

时钟:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 

import javax.swing.ImageIcon; 
import javax.swing.JPanel; 


public class Clock extends JPanel { 




    private Image back; 
    private int angle = 1; 
    private int a = 1; 
    private int b = 0; 

    public Pointer pPink; 
    public Pointer pWeird; 
    public Pointer pRose; 







    public Clock(){ 
     pPink = new Pointer(3600,"pink.jpg"); 
     pWeird = new Pointer(60,"weird.jpg"); 
     pRose = new Pointer(1,"rose.jpg"); 


     } 




    public void paint(Graphics g) { 
     Graphics2D g2d = (Graphics2D) g; 
     if (pPink.img != null){ 

      g2d.rotate(pPink.angle*(3.1415/180)); 

      g2d.drawImage(pPink.getImg(), 200 ,60, this); 

      } 

     if (pWeird.img != null){ 
      g.drawImage(pWeird.getImg(), 250, 200, null); 
      } 

     if (pRose.img != null){ 
      g.drawImage(pRose.getImg(), 300, 200, null); 
      } 




     ImageIcon i = new ImageIcon(this.getClass().getResource("wheel.png")); 
     back = i.getImage(); 
     g.drawImage(back,50,50, null); 


     g.dispose(); 
     cycle(); 

      } 

    public void cycle(){ // a terrible try to solve the problem... 

     if (angle != pPink.angle){ 

      repaint(); 
      System.out.println(angle); 
      System.out.println(pPink.angle); 
      System.out.println(""); 
      angle = pPink.angle; 


     } 

    } 
} 

指针:

import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.ImageIcon; 
import javax.swing.Timer; 


public class Pointer implements ActionListener { 

    public int angle = 0; 
    public int speed; 
    public String fileName; 
    public Image img; 
    Timer timer; 




    public Pointer(int speed, String fileName) { 
     this.speed = speed * 1000 ; 
     timer = new Timer(this.speed, this); 
     timer.start(); 

     this.fileName = fileName; 
     ImageIcon ii = new ImageIcon(getClass().getResource(this.fileName)); 
     img = ii.getImage(); 



    } 


    public Image getImg(){ 
     return img; 

    } 

    public void actionPerformed(ActionEvent e) { 
     angle+= 6; 
     System.out.println("angle increased"); 

    } 


} 
+0

动作在哪里产生? – DJClayworth

回答

0

如何尝试Observer模式。 Clock将是观察者,他将观察Pointer。执行操作时,Pointer将通知Clock

+0

谢谢!那正是我想要的! – Nils

+0

欢迎!乐意效劳。 :-) –

0

一个参考时钟加入的指针类:

. . . 
private Clock clock; 

public Pointer(Clock clock, int speed, String fileName) { 
    this.clock = clock; 
. . . 

然后你就可以调用你的actionPerformed方法重绘上的时钟:

. . . 
public void actionPerformed(ActionEvent e) { 
    angle += 6; 
    System.out.println("angle increased"); 
    clock.repaint(); 
. . . 

到实例指针:

. . . 
public Clock(){ 
    pPink = new Pointer(this, 3600, "pink.jpg"); 
    pWeird = new Pointer(this, 60, "weird.jpg"); 
    pRose = new Pointer(this, 1, "rose.jpg"); 
. . .