Swing Ausführung einer SwingWorker Klasse stoppen

ralfb1105

Bekanntes Mitglied
Hallo,

für ein DB Test Programm möchte ich bestimmte Test Sequenzen in einer Klasse starten die während der Ausführung Ausgaben in einem JTextArea ausgibt. Um Das GUI nicht zu blockieren habe ich hier schon gelernt das ich die SwingWorker Klasse benutzen sollte, welche eine Nebenläufigkeit implementiert. Bevor ich diese Klasse mit den Tests nun starte "ziehe" ich einen Timer auf der die Test Laufzeit herunterzählt und die aktuell noch verbleibende Zeit anzeigt. Letzeres funkttioniert nun auch nach guter Hilfe von Euch hier im Forum :)

Ich habe mir nun gedacht, das ich innerhalb der Klasse in dem ich den Timer runterzähle und ausgebe die neue DbTest Klasse aufrufe, und nach Beendigung des Timer diese auch wieder stoppe. Hier sind wir nun bei meinem Problem :( Ich kann den Timer und die DBTest Klasse starten, beide geben Ihre Ausgaben aus, aber nach Beendigung des Timer kann ich die DbTest Klasse nicht stoppen - NullPointerException :(

Hier nun der Code den ich verwendet habe:
1. Klasse die den Timer enthält und auch die DbTest Klasse (ProcessWorkerDbTest) startet

Java:
class ProcessWorkerCounter extends SwingWorker<Void, String>
    {
        private JLabel jLCounter;
        private long seconds;
        Timer timer = null;
        ProcessWorkerDbTest pt = 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) {
                            seconds--;
                            long hh = seconds / 3600;
                            long mm = (seconds % 3600) / 60;
                            long ss = seconds - (hh * 3600) - (mm * 60);
                            DecimalFormat format = new DecimalFormat("00");
                            publish(format.format(hh) + ":" + format.format(mm) + ":" + format.format(ss));
                            if (seconds == 0) {
                                timer.stop();
                                publish("Test finished!");
                                pt.cancel(true);
                        }
                       
                    }
                });
                timer.start();
                clearOutputArea();
                ProcessWorkerDbTest pt = new ProcessWorkerDbTest(jTAOutput);
                pt.execute();
            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"));
            }
        }
    }
2. Die Klasse die den DbTest simuliert - noch kein echter Code o_O

Java:
class ProcessWorkerDbTest extends SwingWorker<Void, String>
    {
        private JTextArea jTAOutput;
       
        public ProcessWorkerDbTest(JTextArea textArea)
        {
            this.jTAOutput = textArea;
        }


        @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.
            while (!isCancelled()) {
                for (int i=1000; i>=0; i--) {
                    publish("DB Test Run: " + i);
                    TimeUnit.SECONDS.sleep(1);
                }
            }
            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++)
            {
                jTAOutput.append(chunks.get(i));
                jTAOutput.append(System.getProperty("line.separator"));
            }
        }
    }

Der Start überfolgt einen Button:

Java:
private void jBStartCounterActionPerformed(ActionEvent evt) {
        long hours = Long.parseLong(jTFHour.getText());
        long minutes = Long.parseLong(jTFMinute.getText());
        long seconds = Long.parseLong(jTFSecond.getText());
        seconds = (hours * 3600) + (minutes * 60) + seconds;
        ProcessWorkerCounter pc = new ProcessWorkerCounter(jLCounter, seconds);
        pc.execute();
    }

Problem: Nach Ablauf des Timer, also beim Aufruf von
Java:
pt.cancel(true);
bekomme ich eine NullPointerException:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at oracle.OraAccess$ProcessWorkerCounter$1.actionPerformed(OraAccess.java:258)
    at javax.swing.Timer.fireActionPerformed(Unknown Source)
    at javax.swing.Timer$DoPostEvent.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

Über eine Idee was ich hier falsch mache wäre ich sehr dankbar. Danke Euch schon mal.

Gruß

Ralf
 

ralfb1105

Bekanntes Mitglied
Hallo Robat,

Danke für Deine schnelle Antwort. Da ich blutiger Java Anfänger bin muss ich gestehen das ich nicht weiß wo ich Deine Antwort im Code "einsortieren" soll ... ??

Ich muss doch ein neues Objekt der Klasse "ProcessWorkerDbTest" erstellen um dann die Ausführung mittels Objekt.execute() zu starten .. oder bin ich jetzt komplett falsch unterwegs ??

Es wäre toll wenn Du mir an Hand meines Codes schreiben lönntest wo ich Deiner Meinung nach den Fehler habe. Danke schon mal für Deine Hilfe!

Gruß
Ralf
 

Robat

Top Contributor
Vielleicht hier mal zum Verständnis dein Code ein wenig gekürzt und mit Kommentaren.
Java:
    private ProcessWorkerDbTest pt = null;  // (1)
   
    @Override
        protected Void doInBackground() throws Exception
        {
                timer = new Timer(1000, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                            ..
                           if (seconds == 0) {
                                ...
                                pt.cancel(true);   // dieses pt bezieht sich auf das mit (1) markierte Objekt .. welches noch NULL ist .. daher auch die NullPointerException
                        }
                      
                    }
                });
                ...
                ProcessWorkerDbTest pt = new ProcessWorkerDbTest(jTAOutput); (2)
                 // hier erstellst du ein neues Objekt was du auch pt nennst. Dieses hat aber nichts mit dem
                 // mit (1) markierten Objekt zu tun. Dies bleibt immer NULL
                 // anstatt ein zweites Objekt zu erstellen was auch pt heißt, solltet du das eigentliche Objekt initialisieren.
                pt.execute();
            return null;
        }
 

ralfb1105

Bekanntes Mitglied
Hallo Robat,

ja so ist das mit den Anfängern :rolleyes:
DANKE für Deine Erklärungen .. jetzt ist es auch mir klar ;) habe die Klasse jetzt folgendermassen geändert:
Java:
class ProcessWorkerCounter extends SwingWorker<Void, String>
    {
        private JLabel jLCounter;
        private long seconds;
        Timer timer = null;
        ProcessWorkerDbTest pt = new ProcessWorkerDbTest(jTAOutput);
        //ProcessWorkerDbTest pt = 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) {
                            seconds--;
                            long hh = seconds / 3600;
                            long mm = (seconds % 3600) / 60;
                            long ss = seconds - (hh * 3600) - (mm * 60);
                            DecimalFormat format = new DecimalFormat("00");
                            publish(format.format(hh) + ":" + format.format(mm) + ":" + format.format(ss));
                            if (seconds == 0) {
                                pt.cancel(true);
                                timer.stop();
                                publish("Test finished!");
                                pt.printFinishMessage("\nDB Test finishing ...\n");
                               
                        }
                       
                    }
                });
                timer.start();
                clearOutputArea();
                pt.execute();
               
            return null;
        }
Jetzt gibt es nur ein Objekt "pt" und dieses wird gestartet (pt.execute()) und auch wieder gestoppt über das "cancel" flag der SwingWorker Klasse (pt.cancel(true)).

Vielen Dank noch einmal!!!

Gruß

Ralf
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
W Swing Ausführung einer .jar zeigt keine Reaktion AWT, Swing, JavaFX & SWT 4
G Swing JButton ändert (unerwünscht) Größe bei Ausführung AWT, Swing, JavaFX & SWT 4
it_is_all Swing Button, ComboBox,... -- Unterschied: NetBeans Design <-> Ausführung AWT, Swing, JavaFX & SWT 2
T Javafx Ausführung AWT, Swing, JavaFX & SWT 7
I Fataler Error bei GUI-Ausführung AWT, Swing, JavaFX & SWT 3
J Anfänger GUI Problem bei der Ausführung eines sehr einfachen Programms AWT, Swing, JavaFX & SWT 2
D Swing Bei MenuSelectionManager auf Ausführung warten? AWT, Swing, JavaFX & SWT 5
C JFileChooser hängt bei Ausführung mit Terminal AWT, Swing, JavaFX & SWT 2
A Swing Vokabeltrainer zeigt in einfacher Ausführung nichts an AWT, Swing, JavaFX & SWT 5
B Problem bei JAR Ausführung AWT, Swing, JavaFX & SWT 7
M Swing JList Item in andere JList während Ausführung AWT, Swing, JavaFX & SWT 4
X Applet Java Applet Datei Ausführung AWT, Swing, JavaFX & SWT 9
B MouseMotionListener stotterhafte Ausführung AWT, Swing, JavaFX & SWT 2
VfL_Freak Swing kann ich einen laufenden Timer mitten in der Ausführung abbrechen? AWT, Swing, JavaFX & SWT 6
D Mehrfach ausführung der GUI AWT, Swing, JavaFX & SWT 5
O Doppelte Ausführung von KeyPressed AWT, Swing, JavaFX & SWT 7
A AWT Button verhindert ausführung vom Keylistener AWT, Swing, JavaFX & SWT 4
R doppelte Ausführung bei einfachem Mausklick! AWT, Swing, JavaFX & SWT 12
G Problem mit zeitlicher Ausführung AWT, Swing, JavaFX & SWT 4
E mehrere repaint() Aufrufe - NUR eine Ausführung. Warum? AWT, Swing, JavaFX & SWT 59
F polygon object "stirbt" vor Ausführung in paint() AWT, Swing, JavaFX & SWT 4
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
T VerifyListener - Ersetzen einer 0 AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
H JavaFX Timeline II: Verschieben einer ImageView AWT, Swing, JavaFX & SWT 16
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
L Swing TextPanel Schrift untereinander und auf einer Höhe AWT, Swing, JavaFX & SWT 3
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
melaniemueller Wortliste in einer Datei ablegen AWT, Swing, JavaFX & SWT 12
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
U Was genau ist das Objekt einer affinentransformation? AWT, Swing, JavaFX & SWT 1
B JavaFX Prüfen ob ein Objekt sich mehrmals in einer Liste befindet AWT, Swing, JavaFX & SWT 5
mac2010 JavaFX Einbindung einer Karte AWT, Swing, JavaFX & SWT 1
donnico2 Objekte in der GUI ausgeben mit Hilfe einer DAO AWT, Swing, JavaFX & SWT 1
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
W Aufrufen einer bestimmten Scene mit if-Bedingung AWT, Swing, JavaFX & SWT 4
J Ablaufsteuerung/Anleitung machen mit JDialog und einer Zustandsmaschine AWT, Swing, JavaFX & SWT 1
missy72 JavaFX Wiederholen einer IF-Abfrage beim erneuten Öffnen einer Stage AWT, Swing, JavaFX & SWT 11
missy72 JavaFX TableView / TableColumn / ObservableList / zwei Werte in einer Zelle AWT, Swing, JavaFX & SWT 2
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
missy72 JavaFX ObservableList in einer ArrayList speichern. AWT, Swing, JavaFX & SWT 7
HoT Sortieren von ein paar Zeilen in einer Tabelle, aber nicht die ganze Tabelle AWT, Swing, JavaFX & SWT 3
kodela Swing Element einer JComboBox ausgrauen AWT, Swing, JavaFX & SWT 3
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
N Einer TextArea ein ScrollPane hinzufügen AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
A checkbox in einer TableView abhängig von einem anderen Celleninhalt disablen AWT, Swing, JavaFX & SWT 1
G Verknüpfung einer pdf Datei AWT, Swing, JavaFX & SWT 2
B Ausgaben einer Umrechnung vom Textfeld in ein Label AWT, Swing, JavaFX & SWT 2
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
N Wie kann ich zwei Grafiken in einer Oberfläche anzeigen lassen? AWT, Swing, JavaFX & SWT 8
@SupressWarnings() JavaFX Auf den Controller einer ListCell zugreifen AWT, Swing, JavaFX & SWT 4
Drachenbauer Swing Wie ändere ich den Hintergrund vom Anzeigefeld einer JComboBox, die nicht zum Hineinschreiben offen steht? AWT, Swing, JavaFX & SWT 32
H 3 verschiedene Nachrichten in einer FXML View die Infos kommen aus DB AWT, Swing, JavaFX & SWT 4
karlmasutra JavaFX Zugriff auf eine erzeugte Scene aus einer anderen Klasse AWT, Swing, JavaFX & SWT 1
S Java GUI durch variable Größe einer Map anpassen AWT, Swing, JavaFX & SWT 3
B Textfelder in einer ListView ausgeben AWT, Swing, JavaFX & SWT 13
J Searchfunktion auf einer MS Access Datenbank AWT, Swing, JavaFX & SWT 7
B Text im Tetfeld in einer TableView darstellen AWT, Swing, JavaFX & SWT 20
M Inhalte einer FlowPane AWT, Swing, JavaFX & SWT 4
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
E Prinzip: wie man Ereignisse in einer GUI verarbeit. Frage zum Design? AWT, Swing, JavaFX & SWT 10
FRI3ND JavaFX: Wie kann ich einer Scene Argumente übergeben? AWT, Swing, JavaFX & SWT 14
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
G JavaFX JavaFX-Dialog aus einer Nicht-JavaFX-Anwendung heraus AWT, Swing, JavaFX & SWT 1
1 Swing Progressbar benutzen um Fortschritt einer Methode anzuzeigen AWT, Swing, JavaFX & SWT 4
K JavaFX ViewTable mit einer LinkedList befüllen AWT, Swing, JavaFX & SWT 3
L CardLayout in einer Klasse? AWT, Swing, JavaFX & SWT 2
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
D Java FX Image in einer Webanwendung annotieren und den Bereich ausschneiden AWT, Swing, JavaFX & SWT 0
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
xYurisha Aus einer Gui Buttons, Label und ProgessBars entfernen AWT, Swing, JavaFX & SWT 4
MiMa Selektion aus einer ListView AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1
J JFram Location aus Konstruktor einer anderen Klasse auslesen AWT, Swing, JavaFX & SWT 10
L Methode zum Füllen einer ComboBox AWT, Swing, JavaFX & SWT 4
J Suche nach einer horizontal aufklappbaren Toolbar AWT, Swing, JavaFX & SWT 1
P Variable einer Eingabe in anderes Textfeld schreiben AWT, Swing, JavaFX & SWT 7
D JavaFX Einbinden einer .fxml AWT, Swing, JavaFX & SWT 1
B Zeile einer Tabelle selektieren AWT, Swing, JavaFX & SWT 1
A Prüfung einer Eingabe auf Gleitkommazahl AWT, Swing, JavaFX & SWT 5
J Suchmaschine einer Datenbank AWT, Swing, JavaFX & SWT 5
Kanda Sorata Inhalt einer .txt Datei einlesen und in ein Label einfügen (JavaFX) AWT, Swing, JavaFX & SWT 2
A Swing JLabels in einer ForEach Schleife an den JPanel anheften (UNO Netzwerkspiel) AWT, Swing, JavaFX & SWT 1
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben