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