Java-类之间的通信-问题

Java-类之间的通信-问题,java,class,communication,clock,Java,Class,Communication,Clock,我正在制作一个模拟时钟,但我有一个无法解决的问题 我有三门课:main、clock、pointer。 Main只是创建时钟并启动一切。 时钟管理时钟的工作方式并绘制它。 指针定义了指针的作用 时钟产生三个指针,具有不同的图像和速度。 在指针类中,计时器以参数速度启动 根据速度(即,它是什么指针),指针角度将增加。 这只钟在作画时得到角度 我的问题是,我无法让指针对象告诉时钟何时执行了一个操作,以便可以对其进行更新和重新绘制?如何解决?我无法从指针创建一个新的时钟对象,因为我会遇到大量错误 请帮忙

我正在制作一个模拟时钟,但我有一个无法解决的问题

我有三门课:main、clock、pointer。 Main只是创建时钟并启动一切。 时钟管理时钟的工作方式并绘制它。 指针定义了指针的作用

时钟产生三个指针,具有不同的图像和速度。 在指针类中,计时器以参数速度启动

根据速度(即,它是什么指针),指针角度将增加。 这只钟在作画时得到角度

我的问题是,我无法让指针对象告诉时钟何时执行了一个操作,以便可以对其进行更新和重新绘制?如何解决?我无法从指针创建一个新的时钟对象,因为我会遇到大量错误

请帮忙

代码如下:(忽略时钟中的cycle()方法)

Main:

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

   }


}
时钟:

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

   }


}
指针:

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

   }


}

试试
Observer
模式怎么样。
时钟将是观察
指针的观察者。执行操作时,
指针将通知
时钟。

在指针类中添加对时钟的引用:

. . . 
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");
. . .

动作在哪里生成?谢谢!那正是我想要的!