background image

Laboratorium z informatyki sem. II 

 

Wydział Transportu PW - 2010/11 

Przykład zadania na kolokwium 2. 

Przykład animacji - zegar 

Opracować aplikację, która wyświetla tarczę zegara z dwiema obracającymi się wskazówkami. 

Wskazówki zegara są odcinkami o położeniu zmieniającym się w takt przerwań generowanych przez 

komponent Timer. Wykorzystamy metody klasy Timer: start() , stop() oraz metodę setDelay (d) określającą 
interwał  d  między zgłoszeniami zdarzeń timera. 

 Prędkość obrotu jest regulowana za pomocą komponentu JSlider, dla którego minimum=50, maximum=500. 

Rysunek tworzymy na panelu o rozmiarach 200 x 200 (środek tarczy znajduje się w punkcie (100,100)).  

 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

 
public class Animacja extends javax.swing.JFrame  

implements ActionListener{ 

  double a1,a2; 

// a1,a2 – kąty między wskazówkami i osią y 

  Zegar Z ; 
  Timer T; 
public Animacja() { 
   initComponents(); 
   setSize(400, 400);  
   Z=new Zegar();  Z.setBounds(20,20,200,200); 
   add( Z); 
   T = new Timer(200, this);         

//początkowy takt zegara 200 ms

 

 } 
  public class Zegar extends JPanel { //klasa wewnętrzna 
    public void paintComponent(Graphics g) { 
     int x,y, d1=90, d2=70; 
     g.setColor(Color.yellow); g.fillOval(0, 0, 200, 200); 

// rysowanie tarczy

  

     g.setColor(Color.BLUE);  g.drawOval(0, 0, 198, 198);  
     g.setColor(Color.BLACK); 
     x=100+(int)(d1*Math.sin(a1)); 

//(x,y) - koniec wskazówki

  

     y=100-(int)(d1*Math.cos(a1));    
     g.drawLine(100, 100, x, y);  

// rysowanie wskazówki minutowej

 

     x=100+(int)(d2*Math.sin(a2));    
     y=100-(int)(d2*Math.cos(a2));    
     g.drawLine(100, 100, x, y);  // 

rysowanie wskazówki godzinowej

 

    } 
  }  
public void actionPerformed(ActionEvent e) { 
  a1=a1+Math.PI/30;         

// nowe położenie wskazówki minutowej

 

  Z.repaint();  
  if (a1>2*Math.PI){        

// następna godzina

 

    a1=a1-2*Math.PI;  

    a2=a2+Math.PI/6;  } 
}. 
private void jButton1Start(java.awt.event.ActionEvent evt) {  
   T.start();   

// uruchomienie timera

    

}  
private void jButton2Stop(java.awt.event.ActionEvent evt) {  
   T.stop();   

// zatrzymanie timera

    

}  
private void jSlider1MouseDragged(java.awt.event.MouseEvent evt) {  
   T.setDelay(jSlider1.getValue()); 

// zmiana interwału timera

 

}  
 
    public static void main(String args[]) { 
        java.awt.EventQueue.invokeLater(new Runnable() { 
            public void run() { 
                new Animacja().setVisible(true); 
            } 
        }); 
    } 
}