2011-01-11 18 views
0

Wie kann ich etwas abfangen, wenn der Benutzer die Exit-Option aus einem Menü auswählt? Ich meine, ich möchte in der Lage sein, das Ereignis eines Benutzers zu verwalten, der die Anwendung schließen wird , aber einige Aktivität wird ausgeführt, so dass er/sie nicht in der Lage sein sollte, zu beenden.Keine Exit-Option, wenn etwas ausgeführt wird

Hier ist der Code, den ich schrieb. Auf den Punkt gebracht:

  • Aufzeichnung durchgeführt wird -> User-Exit klickt -> WARNUNG „Prozess läuft, können Sie es nicht tun“ (Der Prozess geht weiter)

  • nichts laufen -> Benutzer klickt auf Exit -> Anwendung schließt

Ist es möglich, das Problem, indem einfach ein paar Zeilen Code zu lösen, ohne das gesamte Programm neu zu schreiben?

Vielen Dank im Voraus.
MAX

exitAction = new AbstractAction("Exit") { 

      public void actionPerformed(ActionEvent e) { 

       System.exit(0); 
      } 
     }; 
     exitAction.putValue(Action.NAME, "Exit"); 
     // description 
     exitAction.putValue(Action.SHORT_DESCRIPTION, "Exit application"); 
+0

Das Verhindern von Benutzeraktionen ist keine gute Idee. Öffnen Sie stattdessen einen Dialog, der dem Benutzer mitteilt, was passiert, und fragt nach der Bestätigung, dass das Programm beendet werden soll. – Anon

Antwort

0

Sie müssen den Überblick über Ihre Jobs zu halten, um diese sauber zu tun. Wenn Sie nicht können, können Sie versuchen, alle jvm-Threads zu durchlaufen und nachzusehen, ob sich einige Ihrer Worker-Threads in einem ausführbaren Zustand befinden oder nicht.

Denken Sie daran, dass der Benutzer cand die Anwendung mit der großen Task-Manager-Axt töten kann, wenn er dies wünscht :).

+0

Wie überprüfe ich, ob ein Thread läuft? Das ist ein kniffliges Problem für mich. – max

+0

Thread.isAlive() Methode? Http: //download.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.html#isAlive()? –

+0

Ich versuchte dies aber ich bekomme Fehler ich weiß nicht, warum Fehler: -> nicht-statische Methode IsAlive() kann nicht von einem statischen Kontext referenziert werden if (RecThread.isAlive()) { JOptionPane.showMessageDialog (this, "Warning!", "Thread läuft", JOptionPane.WARNING_MESSAGE); } sonst { System.exit (0); } – max

0

Wenn Sie mit "running" unfertige Threads meinen, dann können Sie alle Threads, die Sie gestartet haben, loopen und .join() aufrufen. davor wird eine Nachricht angezeigt, die darauf wartet, dass alle Threads beendet werden. Wollen Sie zwingen, schließen '

+0

Würde das funktionieren? Nach meinem Verständnis garantiert der Aufruf von join(), dass die Methode erst zurückkehrt, wenn die run() - Methode der Threads abgeschlossen ist. Wenn er seine App herunterfährt und sich allen Threads anschließt, muss er warten, bis diese Threads abgeschlossen sind. – JasCav

+0

Join blockiert den aktuellen Thread. Er kann nicht zur nächsten Zeile weitergehen, die exit() ist – Bozho

0

Sie könnten eine Variable, ein kleines Flag, Sie setzen es auf True am Anfang des Prozesses, den Sie überprüfen möchten, wenn es endet, auf false setzen.

Dann können Sie im Abschluss-Event überprüfen, ob diese Variable wahr oder falsch ist.

0

Wenn Sie keine Threads in Ihrer Anwendung verwenden (ich gehe davon aus, dass Sie es sind, aber um der Klarheit willen), dann wird der Event Dispatch Thread (EDT) alles schließen, wenn Sie Ihre Anwendung verlassen für dich.

Andernfalls ist es wichtig, dass Sie Ihre Threads im System korrekt verwalten und nachverfolgen, damit Sie sie beenden und beenden können, bevor Sie das System herunterfahren. Es gibt eine Reihe von Möglichkeiten, dies zu tun (BITTE NICHT stop() verwenden und versuchen, destroy() zu vermeiden). Meine Empfehlung ist, dass Sie sich innerhalb Ihrer Threads die Zeit nehmen, um zu überprüfen, ob sie heruntergefahren werden sollten (ein Flag, das vom System beim Herunterfahren gesetzt wird, ist eine solche Möglichkeit). Auf diese Weise können Sie Ihre Threads bereinigen, alle Daten speichern (in eine Datei oder was auch immer, wenn dies erforderlich ist) und dann sauber herunterfahren.

Verwandte Themen