Takie coś zrób na stoperze, tak jak Ci podałem w poprzednim poście.
Nie działa Ci to teraz na pewno, bo
- startujesz miliard wątków kiedy wciskasz przycisk za to odpowiedzialny ( jeżeli istnieje wątek liczący to go najpierw zatrzymaj, dopiero startuj nowy)
- nigdzie nie ustawiasz na true warunku pętli P
Idąc dalej - tam masz coś że Ci this nie działa. Oczywiście, że this Ci nie zadziała, bo this odnosi się do kontekstu ( w kodzie) w którym jest umieszczony. Wiesz co to klasy anonimowe ?? To takie klasy których sam sobie nie tworzysz w osobnym pliku, tylko klepiesz je bezczelnie w kodzie, a potem w klamrach albo implementujesz im abstrakcyjne metody (interfejsy) albo nadpisujesz pewne metody(@Override). Przykład ? a no właśnie
ActionListener bl = new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
};
wygląda znajomo?
bl nie jest obiektem klasy ActionListener, bo po primo ActionListener jest interfejsem (a interfejs nie ma swoich instancji tylko klasy), secundo tworzysz tutaj właśnie klasę anonimową którą kompilator nazwie Ci mniej więcej tak- Nazwa_klasy_zewnętrznej_$n (chyba z _) gdzie klasa zewnetrzna to jest ta wewnątrz której wkeisz ten kod a n to jest numer która to z kolei anonimowa klasa jest w twoim kodzie. Także bl jest obiektem klasy której nazwy nie znasz (bo to klasa anonimowa) implementującego interfejs ActionListener. Także jeżeli wewnątrz actionPerdorma dasz this, to this będzie właśnie wskazywał na tą klasę anonimową a nie na Twoją stoper2.
Do stoper2 zamiast getself można się jeszcze dobrać wstawiając takie coś
Stoper.this // i to będzie referencja na obiekt typu Stoper w którym to wywołanie się znalazło
na temat tego jestem pewno ze Shalom się wypowie odpowiednio
A co do Twojego rozwiązania, to masz tutaj zrobione po twojemu z modami (chociaż bez sensu robota, od tego jest Timer;]):
package testowa;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
public class Stoper extends JFrame implements Runnable {
volatile boolean continueExecuting = true;
int i = 0;
Thread s1 = null;
int licznik = 0;
JLabel labelka;
JButton button, button1;
public Stoper getSelf() {
return this;
}
void stopThread() {
continueExecuting = false;
System.out.println("Wartosc continueExecuting... :" + continueExecuting);
}
public void run() {
System.out.println("Wartosc continueExecuting/// :" + continueExecuting);
while (true) {
try {
for (int i = 0; i < 100 && continueExecuting == true; i++) {
Thread.sleep(10);
}
} catch (InterruptedException e) {
}
if(continueExecuting==true)
licznik++;
else break;
labelka.setText("licznik :" + licznik);
System.out.println("Wartosc continueExecuting ***:" + continueExecuting);
}
}
public Stoper() {
ActionListener al = new ActionListener() {
public void actionPerformed(ActionEvent e) {
stopThread();
if (s1 != null) {
try {
s1.join();
} catch (InterruptedException ex) {
Logger.getLogger(Stoper.class.getName()).log(Level.SEVERE, null, ex);
}
}
continueExecuting = true;
licznik = 0;
labelka.setText("licznik :" + licznik);
s1 = new Thread(getSelf());
// lub
// s1=new Thread(Stoper.this);
s1.start();
}
};
ActionListener bl = new ActionListener() {
public void actionPerformed(ActionEvent e) {
stopThread();
}
};
System.out.println("Wartosc continueExecuting :" + continueExecuting);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(200, 200);
labelka = new JLabel("Stoper");
button = new JButton("Start/Restart");
button1 = new JButton("Stop");
button.addActionListener(al);
button1.addActionListener(bl);
setVisible(true);
add(labelka, BorderLayout.NORTH);
add(button, BorderLayout.EAST);
add(button1, BorderLayout.WEST);
//s1 = new Thread(getSelf());
//analogicznie, bez użycia metody getSelf(), bo w actionlistenerze 'this' nie zadziała s1 = new Thread(this);
}
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Stoper();
}
});
}
}