Ja, es ist möglich, einen Swing-Timer zu vermeiden, mit, dies zu erreichen, aber wenn Sie tut dies dann:
- Sie haben würden sicherstellen, dass die Schleife und die
Thread.sleep(...)
in einem Hintergrund laufen gelassen wurden Faden des Swing-Ereignisthreads. Wenn Sie dies nicht tun, frieren Sie den Event-Thread ein und frieren Ihre GUI ein und machen sie unbrauchbar.
- Und dann müssen Sie sicherstellen, dass wenn Sie Swing-Aufrufe nur aus dem Hintergrundthread machen, Sie sich bemühen, diese Aufrufe in den Swing-Ereignisversand Thread einzufügen. Wenn Sie dies nicht tun, besteht die Gefahr, dass Threading-Fehler gelegentlich sehr schwer zu beheben sind.
Wegen der zusätzlichen Arbeitsaufwand und das Risiko der es falsch bekommen, werden Sie feststellen, dass es viel einfacher und sicherer nur eine Swing-Timer zu verwenden. Zum Beispiel sieht Ihr geposteter Code so aus, als wäre es ein großes Risiko, die gesamte GUI/Anwendung in den Ruhezustand zu versetzen, da er sowohl eine while-Schleife als auch eine Thread.sleep(...)
aufgerufen hat, ohne dass Threading betroffen ist.
Zum Beispiel, ohne Timer, könnten Sie den Code in etwa so aussehen (Einschränkung: Code nicht kompiliert noch getestet):
new Thread(new Runnable() {
public void run() {
int counter = 0;
while (counter < 10) {
lblDisplay.setText("Completed " + Integer.toString(counter));
try {
Thread.sleep(1000);
final int finalCounter = counter;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
lblDisplay.setText("Completed " + finalCounter);
}
});
} catch (InterruptedException ex) {
Logger.getLogger(Increment.class.getName()).log(Level.SEVERE, null, ex);
}
counter++;
}
}
}).start();
Das ist ein bisschen komplizierter ist als Ich mag, während der Swing-Timer aussehen könnte :
int delay = 1000;
new Timer(delay, new ActionListener() {
private int count = 0;
@Override
public void actionPerformed(ActionEvent e) {
if (count < 10) {
lblDisplay.setText("Completed " + counter);
} else {
((Timer) e.getSource()).stop(); // stop the Timer
}
counter++;
}
}).start();
Das ist einfacher und sicherer als das vorherige.
Die eigentliche Frage ist warum? Was macht Ihr Ansatz besser als Swing 'Timer'? – MadProgrammer
Bitte lesen Sie die zu beantwortenden Änderungen. Bitte fragen Sie nach eventuellen Fragen. –