Swing Timer in SwingWorker stoppen

ralfb1105

Bekanntes Mitglied
Hallo zusammen,

ich bin auf der Suche nach einer Lösung für mein Problem mit dem Swing Timer aufgerufen in einer Klasse die um SwingWorker erweitert ist um eine Nebenläufigekit im GUI zu erzielen.

Hier kurz die Problembeschreibung.
Ich möchte ein GUI programmieren welches einen DB Test startet dr so lange ausgeführt wird bis eine vorher gesetzte Laufzeit abgelaufen ist.
Ich habe damit angefangen zu versuchen einen Counter zu programmieren der nebenläufig ist, soll heißen die GUI Ausführung nicht unterbricht. Im Prinzip habe ich das hin bekommen, mit Hilfe eines Beispiels welches mir zu einem ähnlichen Thema in diesem Forum schon mal vorgestellt wurde. Jetzt habe ich aber das Problem das der Counter läuft, ich kann auch andere Aktionen im GUI ausführen, doch leider endet der Counter nicht nach der Zeit sondert läuft endlos weiter.

Hier meine Code Idee zu dem Thema:

Java:
class ProcessWorkerCounter extends SwingWorker<Void, String>
    {
        private JLabel jLCounter;
        private long seconds;
       
        public ProcessWorkerCounter(JLabel counter, long seconds)
        {
            this.jLCounter = counter;
            this.seconds = seconds;
        }


        @Override
        protected Void doInBackground() throws Exception
        {
            //hier läuft alles in einem eigenen Thread (nebenläufig) ab. Es ist also egal wie lange die Abarbeitung hier dauert.
            Timer timer;
                timer = new Timer(1000, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                            publish(String.valueOf(seconds));
                            seconds--;
                            if (seconds == 0) {
                                //cancel(true);
                                //timer.removeActionListener(this);
                                //timer.stop();
                        }
                       
                    }
                });
                timer.start();
            return null;
        }
       
        @Override
        protected void process(List<String> chunks)
        {
            //hier läuft alles auf dem EDT (Event Dispatch Thread). Darum können (und sollten) wir hier die GUI Komponenten manipulieren.
            for(int i = 0; i < chunks.size(); i++)
            {
                jLCounter.setText(chunks.get(i));
            }
        }
    }

Der Timer wird über einen Button gestartet:

Java:
private void jBStartCounterActionPerformed(ActionEvent evt) {
        ProcessWorkerCounter pc = new ProcessWorkerCounter(jLCounter, 10);
        pc.execute();
    }

Wie man sieht war meine Idee über "timer.stop()" den Timer zu beenden, aber ich kann timer.stop() an der Stelle im Code nicht aufrufen:
"the local variable timer may have not been initialized".
Auch mit "timer.removeActionListener(this);" habe ich keinen Erfolg. Der Abbruch über die SwingWorker "cancel()" Methode scheitert auch, denn wenn ich eine Schleife darum herum baue mit (while (!isCancelled()) soielt das ganze Programm verrückt was vermutlich daran liegt das ich den Timer immer wieder aufrufe ... ??

Irgendwie sehe ich meinen fehler nicht :( und ich hoffe Ihr könnt mich wieder auf die Spur bringen :)

Danke schon mal .. ich hoffe ich habe mein Problem verständlich ausgedrückt.

Gruß

Ralf
 

ralfb1105

Bekanntes Mitglied
Hallo,

vielen dank für Deinen Vorschlag, aber wenn ich die Zeile
Java:
Timer timer ;
in
Code:
Timer timer = null;
ändere, bekomme ich in Eclipse folgende Fehler bei der Zeile "timer.stop();"
Code:
- Local variable timer defined in an enclosing scope must be final or effective final
- Null pointer access: The variable timer can only be null at this location
Hast Du noch eine Idee, mir sagt das ehrlich gesagt nicht was ich hier genau falsch mache .. ??

Danke schon mal für Deine Hilfe!

Gruß

Ralf
 

ralfb1105

Bekanntes Mitglied
Hallo,

Bingo :) das war es! Wenn ich die Variable "timer" in der Klasse defuniere funktioniert es.
Java:
class ProcessWorkerCounter extends SwingWorker<Void, String>
    {
        private JLabel jLCounter;
        private long seconds;
        Timer timer = null;
       
        public ProcessWorkerCounter(JLabel counter, long seconds)
        {
            this.jLCounter = counter;
            this.seconds = seconds;
        }


        @Override
        protected Void doInBackground() throws Exception
        {
            //hier läuft alles in einem eigenen Thread (nebenläufig) ab. Es ist also egal wie lange die Abarbeitung hier dauert.
            timer = new Timer(1000, new ActionListener() {
            @Override
                public void actionPerformed(ActionEvent e) {
                    publish(String.valueOf(seconds));
                    seconds--;
                    if (seconds == 0) {
                        timer.stop();
                        publish("Timer finished!");
                    }
                 }
            });
            timer.start();
            return null;
        }
       
        @Override
        protected void process(List<String> chunks)
        {
            //hier läuft alles auf dem EDT (Event Dispatch Thread). Darum können (und sollten) wir hier die GUI Komponenten manipulieren.
            for(int i = 0; i < chunks.size(); i++)
            {
                jLCounter.setText(chunks.get(i));
                //jTAOutput.append(System.getProperty("line.separator"));
            }
        }
    }

Da hätte ich auch selbst daruf kommen könne/müssen ... anyway, da habe ich mal wieder etwas dazu gelernt, und darauf kommt es ja beim lernen drauf an.

Ich danke Dir vielmals für Deine Hilfe und wünsche noch einen schönen Sonntag!!

LG

Ralf
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E JDialog mit count down timer AWT, Swing, JavaFX & SWT 1
M 2D-Grafik timer bei Analoguhr AWT, Swing, JavaFX & SWT 2
A Timer AWT, Swing, JavaFX & SWT 1
H Timer ohne alles lahmzulegen? AWT, Swing, JavaFX & SWT 2
O Timer in JOptionPane anzeigen AWT, Swing, JavaFX & SWT 2
T Timer und GIF Animationen pausieren während Maus sich bewegt AWT, Swing, JavaFX & SWT 4
W Swing JLabel jede Sekunde aktualisieren, ohne Timer zu benutzen AWT, Swing, JavaFX & SWT 4
D Timer für Bildfolge in einem jLabel AWT, Swing, JavaFX & SWT 5
M Event Handling MousePressed vs. Timer! AWT, Swing, JavaFX & SWT 5
F Java Timer Bug? AWT, Swing, JavaFX & SWT 6
B Timer, TimerTask und Warten AWT, Swing, JavaFX & SWT 4
R Performance Drag and Drop & Timer AWT, Swing, JavaFX & SWT 3
E Problem mit Timer und Swing AWT, Swing, JavaFX & SWT 8
N AWT Timer überschreiben? AWT, Swing, JavaFX & SWT 8
P Label rotieren mit Timer AWT, Swing, JavaFX & SWT 5
F Swing GUI und Model mit Timer AWT, Swing, JavaFX & SWT 13
K Threads - Timer - run() mehrfach parallel? AWT, Swing, JavaFX & SWT 2
J Nach Timer ausführen AWT, Swing, JavaFX & SWT 6
S Timer oder Thread.sleep AWT, Swing, JavaFX & SWT 3
D Timer JFrame AWT, Swing, JavaFX & SWT 7
F Swing timer nimmt delay nicht an AWT, Swing, JavaFX & SWT 2
S Swing Timer, Countdown AWT, Swing, JavaFX & SWT 2
F Timer welches JPanel aktualisiert AWT, Swing, JavaFX & SWT 6
H Timer/Stoppuhr in MenuBar anzeigen AWT, Swing, JavaFX & SWT 4
D Applet Methode in Timer einbinden AWT, Swing, JavaFX & SWT 6
F Applet Applet starten...(+Timer?) AWT, Swing, JavaFX & SWT 12
R Probleme mit Swing Timer AWT, Swing, JavaFX & SWT 6
C Timer Problem AWT, Swing, JavaFX & SWT 5
VfL_Freak Swing kann ich einen laufenden Timer mitten in der Ausführung abbrechen? AWT, Swing, JavaFX & SWT 6
H Swing Timer Probleme AWT, Swing, JavaFX & SWT 5
Burny91 Swing Mit Timer JLabel updaten AWT, Swing, JavaFX & SWT 2
P Game of Life - PaintComponent-Problem / Timer? AWT, Swing, JavaFX & SWT 8
B JLabel mittels Timer und setLocation verschieben AWT, Swing, JavaFX & SWT 3
O Swing es können keine neuen Labels hinzufügt werden während der Timer läuft AWT, Swing, JavaFX & SWT 14
C Timer erstellen? AWT, Swing, JavaFX & SWT 2
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
K Timer und Threads ruckeln für Fotoschwenk AWT, Swing, JavaFX & SWT 3
L Timer Swing GUI AWT, Swing, JavaFX & SWT 2
G Swing Timer stoppen AWT, Swing, JavaFX & SWT 4
B Swing-Timer AWT, Swing, JavaFX & SWT 4
D javax.swing.Timer bringt NullPointerException AWT, Swing, JavaFX & SWT 4
J Swing timer? AWT, Swing, JavaFX & SWT 2
C Timer, Darstellung einer Uhr AWT, Swing, JavaFX & SWT 4
Z javax.swing.Timer: wie stoppen??? AWT, Swing, JavaFX & SWT 9
ralfb1105 Swing Frage zu SwingWorker Verhalten bei cancel() AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing SwingWorker - max 10 Threats werden gestartet !? AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing Ausführung einer SwingWorker Klasse stoppen AWT, Swing, JavaFX & SWT 4
S Swing SwingWorker - richtige Implementierung doInBackground() AWT, Swing, JavaFX & SWT 5
H Swing BufferedReader.close() hängt im SwingWorker AWT, Swing, JavaFX & SWT 1
Nuiton Swing SwingWorker - Prozess stoppen AWT, Swing, JavaFX & SWT 4
Thallius Auf Swingworker warten? AWT, Swing, JavaFX & SWT 5
M SwingWorker Hilfe! AWT, Swing, JavaFX & SWT 10
J Swing Nach SwingWorker Funktion aus der GUI Klasse aufrufen AWT, Swing, JavaFX & SWT 5
C Swing SwingWorker abbrechen AWT, Swing, JavaFX & SWT 12
C Swing SwingWorker: Auf beendigung eines Formulars / einer Arbeit warten AWT, Swing, JavaFX & SWT 10
Psypsy Swing SwingWorker unterschied zwischen setProgress und process AWT, Swing, JavaFX & SWT 2
A Swingworker rückgabewert verwenden AWT, Swing, JavaFX & SWT 9
B Frage zu Swing,Threads, SwingWorker und Socket Communikation AWT, Swing, JavaFX & SWT 4
M Prioritäten bei SwingWorker / Threads AWT, Swing, JavaFX & SWT 9
M Liste mittels SwingWorker füllen klappt nicht AWT, Swing, JavaFX & SWT 10
Iron Monkey SwingWorker verschwindet nicht AWT, Swing, JavaFX & SWT 10
X Prozess mit Runtime.getRuntime in SwingWorker aufrufen AWT, Swing, JavaFX & SWT 6
R Zugriff auf Model im MVC-Design aus SwingWorker heraus AWT, Swing, JavaFX & SWT 3
G SwingWorker setProgress Problem AWT, Swing, JavaFX & SWT 17
K Frage zu ProgressBar, SwingWorker etc. AWT, Swing, JavaFX & SWT 4
G SwingWorker AWT, Swing, JavaFX & SWT 2
J Unterschied zwischen SwingWorker und Threads AWT, Swing, JavaFX & SWT 4
S SwingWorker :( AWT, Swing, JavaFX & SWT 6
F swingworker und eventdispatch thread AWT, Swing, JavaFX & SWT 9
S SwingWorker - ich werde wahnsinnig AWT, Swing, JavaFX & SWT 4
0 SwingWorker Tutorial ? AWT, Swing, JavaFX & SWT 2
L SwingWorker Thread pausieren AWT, Swing, JavaFX & SWT 12
L SwingWorker Statusabfrage AWT, Swing, JavaFX & SWT 8
M Kann ein SwingWorker nur einmal laufen? AWT, Swing, JavaFX & SWT 2
J SwingWorker, get und boolean AWT, Swing, JavaFX & SWT 6
C Wie kann ich den Sound stoppen? AWT, Swing, JavaFX & SWT 4
G Fenster erst nach Stoppen des Threads anzeigen AWT, Swing, JavaFX & SWT 3
R Thread stoppen, nachdem eine Taste gedrückt wird AWT, Swing, JavaFX & SWT 2
O Thread zerstören / stoppen in java 1.5? AWT, Swing, JavaFX & SWT 9
M JTextPane - Zeilenumbruch verhindern stoppen deaktivieren :) AWT, Swing, JavaFX & SWT 5
m@nu JTable: Editor stoppen AWT, Swing, JavaFX & SWT 8
R TableCellEditor -> editieren stoppen AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben