You are on page 1of 7

Rad sa Timer klasom

U okviru ovog Tutorijala biće biće dat pregled Timer klase i pregled određenih
funkcionalnosti.

Za početak počnimo sa primerom za odbrojavanje. Ovaj primer podešava da Timer u


labeli odbrojava od 10 do 0 nakon čega prestaje sa radom. Odbrojavanje počinje kada
korisnik klikne na dugme “Start”. Svi primeri koji se testiraju nalaze se u paketu
timerfun. Klasa za ovaj prvi primer zvaće se Primer1. Nemojte klase zvati kao java
komponente.
Primer1.java

package timerfun;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Primer1 {

static int countdown = 10;


static Timer t;
static JFrame frame;
static JLabel label;
static JButton button;

private static void createAndShowGUI() {


frame = new JFrame("Countdown");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new
BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS));

label = new JLabel("10");


frame.getContentPane().add(label);
button = new JButton("Start");
frame.getContentPane().add(button);

button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
t = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e)
{
countdown--;
label.setText("" + countdown);
if(countdown == 0) {
t.stop();
}
}
});
t.start();
}
});

frame.setVisible(true);
}

public static void main(String[] args) {


javax.swing.SwingUtilities.invokeLater(new
Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
U okviru ovog primera sve komponente su deklarisane kao statičke promenljive u
okviru klase Primer1, to važi i za primitivne vrednosti. Ovo je urađeno zbog
jednostavnosti pristupama svim promenljivama i komponentama u okviru drugih
metoda i klasa.
Promenljiva countdown služi za kontrolu odbrojavanja. Njenu vrednost koristimo
prikaz isteklog vremena. Da bismo kontrolisali Timer moramo koristiti t = new
Timer(inteval,događaj) kao konstuktor. Interval je vreme izvršavanja timer-a i takođe
služi kao početno odlaganje. Timer prilikom poziva metode start odlaže se za onoliko
sekundi koliko je navedeno.
Događaj je ActionListener interfejs koji implementira actionPerformed metodu koja
sadrži kod koji je potrebno da se izvrši. Standardne promenljive ne mogu da se
proslede ovoj metodi zbog čega koristimo statičke atribute.
Logika je jednostavna prvo smanjimo vrednost countdown za 1, nakon čega u labeli
ispisuje se vrednost u label korišćenjem metode setText. Kada vrednost dođe do 0 i
ispiše se Timer zaustavljamo korišćenjem metode stop. Kreiranje i postavljanje
Timer-a dešava se u okviru klik događaja dugmeta button.
Vizuelno primer izgleda ovako:
Sledeći primer je implementacija semafora.

Primer kreiramo u istom paketu timerfun a ime klase biće Primer2.


Primer2.java

package timerfun;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Primer2 {

static JPanel panelRed, panelYellow, panelGreen;


static JFrame frame;
static Timer t;

private static void createAndShowGUI() {


frame = new JFrame("HelloWorldSwing");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(110, 304);
frame.setLayout(null);
panelRed = new JPanel();
panelRed.setBounds(20,10, 80,80);
panelRed.setBackground(Color.RED);
frame.getContentPane().add(panelRed);

panelYellow = new JPanel();


panelYellow.setBounds(20,92, 80,80);
panelYellow.setBackground(Color.GRAY);
frame.getContentPane().add(panelYellow);

panelGreen = new JPanel();


panelGreen.setBounds(20,174, 80,80);
panelGreen.setBackground(Color.GRAY);
frame.getContentPane().add(panelGreen);

frame.setVisible(true);

t = new Timer(1000, new ActionListener() {


@Override
public void actionPerformed(ActionEvent e) {

if(panelRed.getBackground().equals(Color.RED)) {
panelRed.setBackground(Color.GRAY);

panelYellow.setBackground(Color.YELLOW);
} else
if(panelYellow.getBackground().equals(Color.YELLOW)) {

panelYellow.setBackground(Color.GRAY);

panelGreen.setBackground(Color.GREEN);
} else {
panelGreen.setBackground(Color.GRAY);
panelRed.setBackground(Color.RED);
}
}
});
t.start();
}

public static void main(String[] args) {


javax.swing.SwingUtilities.invokeLater(new
Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
U okviru ovog primera timer startuje odmah po prikazivanju frame komponente. U
okviru događaja koristimo if naredbu da ispitamo koje je trenutno stanje panela. Kako
aplikacija u startu ima početno stanje odnosno boja panelRed je postavljena na
Color.RED, to je polazna tačka za if naredbu. Kada istekne delay od 1000ms prvi uslov
biće tačan pa se boja panelRed menja u Color.GRAY dok panelYellow menja boju u
Color.YELLOW. Zatim se čeka naredni interval. Sada panelRed više nije obojen u
Color.RED pa prvi uslov neće biti tačan i prelazi se na sledeći uslov a to je provera da li
je panelYellow obojen u žutu što jeste opet dolazi do promene gde on prelazi u
Color.GRAY a panelGreen prelazi u Color.GREEN. Opet se čeka naredni interval. Kako
prva dva uslova neće biti ispunjena može se zaključiti da panelGreen mora biti obojen
tako da njegova pozadina prelazi u Color.GRAY a panelRed dobija Color.RED. U
sledećem intervalu opet se ponavlja prvi uslov i tako ide se u krug odnosno simulira se
semafor.

Poslednji primer koji ćemo videti je odlaganje prvog intervala Timer-a sa


setInitialDelay metodom, kao i sprečavanje izvršavanja Timer-a više od jedne iteracije.
U okviru ovog primera potrebno je pomeriti izvršavanje Timer-a za 2000ms a zatim
dozvoliti da se izvrši samo jednom nakon čega u okviru tog događaja treba da iskoči
Pop-Up. Timer se pokreće kada korisnik klikne na dugme.

Primer3.java

package timerfun;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Primer3 {

static JFrame frame;


static JButton button;
static Timer timer;
private static void createAndShowGUI() {
frame = new JFrame("HelloWorldSwing");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

button = new JButton("Start");


frame.getContentPane().add(button);

button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
timer = new Timer(0, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e)
{
JOptionPane.showMessageDialog(frame,
"Activate once after delay!");
}
});
timer.setInitialDelay(2000);
timer.setRepeats(false);
timer.start();
}
});

frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {


javax.swing.SwingUtilities.invokeLater(new
Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
U okviru primera možemo da vidimo da je u konstruktoru timer vrednost intervala
stavljena na 0. Ta vrednost nam za ovaj primer nije važna ali u drugim primerima ako
Vam se Timer ponavlja znajte da će osim prvog intervala svi ostali sa tim vremenskim
razmakom između ostalih intervala.
Mi kontrolišemo prvi delay sa metodom setInitialDelay i tu smo naveli da prvi
interval timer treba odložiti za 2000ms. Sledeća komanda je setRepeats gde
kontrolišete da li će se Timer ponavljati. U našem primeru timer se ne ponavlja, pa
zato interval naveden u konstruktoru nije važan. I na ovaj način smo napravili alert koji
čeka izvršavanje.
Napomena da možete kreirati više Timera, I da možete drugi timer startovati u okviru
prvog Timera što kao rezultat može da Vam da veću kontrolu.

You might also like