javax.swing.Timer - jak zatrzymać timer

0

Witam,
mam mały problem. W poniższym kodzie w klasie "private class StartStopListener" korzystam z javax.swing.Timer. Przycisk "Start" ma startować licznik a "Stop" go stopować. Nie działa mi stopowanie i nie wiem co robię źle. Jeśli w pierwszym if'ie ustawię:

timer.start();
timer.stop();

to nie zastartuje więc stopowanie działa ale jak w drugim if'ie daje

timer.stop()

to nie stopuje i licznik cały czas chodzi mimo, że naciskam przycisk "Stop".
Wie ktoś co jest nie tak ?

package stoper;

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

public class Stoper {

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

}

class Ramka extends JFrame {
	
	public Ramka() {
		setSize(300, 67);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);		
	
		Container cont = getContentPane();
		cont.add(new MainPanel());
	}
}

class MainPanel extends JPanel {
	JButton
		start = new JButton("Start"),
		stop = new JButton("Stop");
	JLabel timeLabel = new JLabel();
	boolean started = false;
	boolean paused = false;
	static Integer timeElapsed = 0;
	
	public MainPanel() {
		timeLabel.setText("<html><b><font size=24>00:00:00");
		
		add(start);
		add(stop);
		add(timeLabel);
		
		ActionListener startStopListener =  new StartStopListener();
		start.addActionListener(startStopListener);
		stop.addActionListener(startStopListener);
	}
	
	private class StartStopListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			Timer timer = new Timer(1000, new StartListener());
			if(e.getSource() == start) {
				if(started == false)
					timer.start();
				started = true;
			} else if(e.getSource() == stop) {
				System.out.println("stop");
				timer.stop();
			}
		}
	
		private class StartListener implements ActionListener {
			
			public void actionPerformed(ActionEvent e) {
				int hours;
				int minutes;
				int seconds;
				String timeToString= "";
				
				++timeElapsed;
				hours = timeElapsed/3600;
				minutes = (timeElapsed - (hours * 3600))/60;
				seconds = timeElapsed - (hours * 3600) - (minutes * 60);
				
				if(hours < 10)
					timeToString+= "0" + hours + ":";
				else
					timeToString+= hours + ":";
				
				if(minutes < 10)
					timeToString+= "0" + minutes + ":";
				else
					timeToString+= minutes + ":";
				
				if(seconds < 10)
					timeToString+= "0" + seconds;
				else
					timeToString+= seconds;
				
				timeLabel.setText("<html><b><font size=24>" + timeToString);
			}
		}
	}
}

</b></b></span></span>

0
Timer timer = new Timer(1000, new StartListener());
                        if(e.getSource() == start) {
                                if(started == false)
                                        timer.start();
                                started = true;
                        } else if(e.getSource() == stop) {
                                System.out.println("stop");
                                timer.stop();
                        }

Za kazdym razem w metodzie actionPerformed tworzysz nowy obiekt timera i to jego uruchamiasz/zatrzymujesz, a powinienes zatrzymywac ten co wczesniej uruchomiles.

0

rzeczywiście, thx

to może jeszcze małe pytanie przy okazji: jak uruchamiam tą aplikację to pojawia się pusta ramka i nie widać przycisków ani labela. Dopiero jak zaczynam zmieniać rozmiar okna to pojawiają się przyciski i label ...

0

dodawanie komponentów do kontenera przed wykonaniem setVisible(true)

0

Albo revalidate().

0

potrzebuje taki sam stoper tyle ze sterowany z klawiatury stop start i zeruj pomoze ktos ?

0

Jak zatrzymuję timer timer.stop(); timer się zatrzymuje ale wykonuje pozostałe instrukcje.

Czy da się zatrzymać timer podobnie jak polecenie break; w pętli??

0

?

timer.stop();
return;
0

tyle że chciałbym wywołać polecenie

timer.stop();

z innej klasy.

Póki co to obchodze to w ten sposób że w innej klasie zmieniam wartość zmiennej a wewnątrz metody timer używam warunku if.

0

No to przekaż timera tej klasie i zawołaj na nim stop. Twoje "obchodzenie" można dać do programistycznych WTF na tym forum :) Właśnie tak się ostatnio zastanawiałem dlaczego chciałeś żeby timer sam siebie obsługiwał przy zatrzymaniu :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1