2016-05-16 17 views
-1

schließen Ich habe ein Programm, das ich mit dem System.exit (0) beende; Befehl.
Wenn dies passiert, wird JPanel geschlossen. Ich möchte es umbenennen öffnen, damit ich den Zustand bei Beendigung sehen kann. Gibt es eine Möglichkeit, das Jpanel offen zu halten, oder gibt es einen besseren Befehl als System.exit()?Wie können Sie verhindern, dass ein JPanel System.exit (0)

nicht sicher, warum eine Abstimmung unten fragte ich eine einfache Frage und jemand antwortete es. Ich kann es nicht so machen, also probier etwas anderes. Mit einem echten false testen, wo in die Simulationsschleife eingetreten werden soll.

+0

Die JPanel Teil der JVM ist. System.exit beendet die JVM. Wenn Sie nicht möchten, dass JPanel verschwindet, können Sie die JVM nicht beenden. – Compass

+0

Um zu wissen, was Sie in Ihre Frage aufnehmen sollten, damit Sie bessere Antworten erhalten, lesen Sie bitte die Abschnitte [Fragen stellen] (http://stackoverflow.com/help/how-to-ask). –

+0

Re '' nicht sicher, warum eine Down-Abstimmung Ich habe eine einfache Frage gestellt und jemand hat darauf geantwortet. '' - Ich bin mir auch nicht sicher, aber es könnte etwas damit zu tun haben, dass Ihre Frage sehr unklar bleibt und Leute dazu bringt, unklar zu schreiben Antworten. Versuchen Sie nochmals, es zu verbessern, damit wir das eigentliche Problem ** und den Code ** verstehen. –

Antwort

4

zu:

Gibt es eine Möglichkeit die JPanel offen zu halten oder gibt es einen besseren Befehl als System.exit()?

Die beste Lösung: Rufen Sie nicht System.exit(...). Warum? Da System.exit(0) die JVM schließt, werden alle Java-Prozesse, die auf dieser JVM ausgeführt werden, heruntergefahren, wenn System.exit(0) aufgerufen wird.

Wie für "bessere Befehl", hängt alles von Ihrer Notwendigkeit ab. Wenn Sie nur ein Fenster wie einen JDialog schließen möchten, rufen Sie myWindow.setVisible(false);. Wenn Sie es schließen und Ressourcen freigeben möchten, dann myWindow.dispose();.

Hinweis: Ich vermute, dass möglicherweise mehrere Fenster geöffnet sind, möglicherweise mehrere JFrames. Wenn ja, ich bitte Sie eindringlich, zu lesen: The Use of Multiple JFrames, Good/Bad Practice?

Sie auch Kommentare geschrieben:

ich die JPanel offen halten möchte, aber die Simulation von mehr ausgeführt werden. Ich muss den Sim stoppen, wenn bestimmte Bedingungen erfüllt sind. so schrieb ich einen Anschlag()

So Ihre Frage in der Tat ist ein XY Problem wo Sie fragen, wie einen spezifischen Code Problem zu lösen (halten einen JPanel offen nach dem Aufruf System.exit(0)), wenn die beste Lösung, die eine ganz andere zu verwenden ist Ansatz. Besser, dass Sie uns das Gesamtproblem mitteilen, das Sie lösen möchten, und nicht, wie Sie es gerade lösen möchten, da System.exit nicht Teil der besten Lösung sein wird.

Wahrscheinlich ist die beste Lösung, Ihr Simulationsmodell von seiner Ansicht (der GUI) zu trennen, um dem Modell Funktionalität zu geben, die es ermöglicht, ohne die JVM zu stoppen - unmöglich zu sagen, wie gegeben unser derzeitiges Wissen über Ihr Problem - und dann das Stoppen des Modells in der Ansicht widerspiegeln, wiederum ohne das System herunterzufahren.

Der Schlüssel zu all dies in den Details Ihres aktuellen Programms liegen, einschließlich der Logik, die Ihre Simulation zugrunde liegt, und wenn Sie das konkretisieren und wahrscheinlich mehr hilfreiche Antworten brauchen, sind Sie wieder zu verbessern, gehen zu wollen, Ihre Frage, die uns mit sehr viel konkreteren Informationen über Ihren Code, Ihr Problem und mit der Veröffentlichung von relevantem Code versorgt, vorzugsweise als minimal example program.

+0

ich würde ich möchte das Jpanel offen lassen, aber die Simulation stoppen Ich muss den Sim stoppen, wenn bestimmte Bedingungen erfüllt sind Ich schrieb einen Stopp() – user3137110

+0

@ user3137110: dann ist die Lösung, die Simulation und nicht die GUI zu stoppen Aber wie können wir vorschlagen, wie Sie das tun, basierend auf dem, was Sie bisher gepostet haben? Ihre Frage scheint * sehr * unvollständig zu sein. –

+0

@ user3137110: überlegen Sie, uns die wichtigen Details zu nennen und uns den entsprechenden Code zu zeigen a [mcve]), damit wir Ihr aktuelles Problem besser verstehen können, indem Sie Ihre ursprüngliche Frage bearbeiten und verbessern –

0

Hier ist eine Art und Weise, durch die Securitymanager für die JVM überschreiben:

//set your security manager 
static{ 
    SecurityManager s = new DontCloseOnExitSecurityManager(); 
    System.setSecurityManager(s); 
} 

static class DontCloseOnExitSecurityManager extends SecurityManager{ 
    public void checkExit(int code){ 
     //here you can put a check to see if you really do want to close - like if the JFrame is still open. 
     if(/*do some check*/ 13 == code) 
     super.checkExit(code); 
     throw new SecurityException("13 is unlucky, you shouldn't system exit on it."); 
     } 
    } 
} 

Sie werden einen angemessenen Platz um es in finden müssen, und auch, wie Sie Ihre Kontrollen tun (in checkExit).

Entschuldigung für Ungenauigkeiten, ich bin nicht vor einer IDE, um dies jetzt zu testen.

+0

Wahrscheinlich eklatante Übertreibung für ein Poster, das wahrscheinlich ein [XY Problem] gepostet hat (http:/(http://www.mywiki.wooled.org/XyProblem) wo er fragte, wie man ein spezifisches Code-Problem löst, wenn die beste Lösung darin besteht, einen völlig anderen Ansatz zu verwenden. –

+0

Dann werde ich einen anderen Ansatz versuchen. – user3137110

2

Haben Sie einen Ansatz versucht, ähnlich wie: Do something when the close button is clicked on a JFrame


 import javax.swing.JOptionPane; 
     /*Some piece of code*/ 
     frame.addWindowListener(new java.awt.event.WindowAdapter() { 
      @Override 
      public void windowClosing(java.awt.event.WindowEvent windowEvent) { 
        //delete this code if you want and replace with .dispose() or anything 
       if (JOptionPane.showConfirmDialog(frame, 
        "Are you sure to close this window?", "Really Closing?", 
        JOptionPane.YES_NO_OPTION, 
        JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION){ 
        //choose to close JVM here if you want 
        System.exit(0); 
       } 
      } 
     }); 
+0

Ich erstelle ein echtes falsch, um die Simulation auszuführen. Ich verstehe die Abstimmung nicht. Ich fragte, ob etwas getan werden könnte, es wurde empfohlen, es nicht so zu machen und etwas anderes zu versuchen. – user3137110

+0

Ich habe Sie Freund nicht heruntergestimmt, JFrame ist Fenster und JPanel ist ein Container. In dem Moment, in dem die JPanel-Instanz ihre Referenz verliert, wird sie als Müll gesammelt. – Petro

+0

aber ich habe Sie für die Weitergabe einiger guter Ideen in einer verwirrenden Frage neu gewählt. –

Verwandte Themen