2017-08-19 4 views
1

J'ai une interface graphique qui extends JFrame qui est créé par ce constructeur d'un autre objet:Lorsque vous fermez un JFrame, est-ce que tout se termine dans le programme?

public Engine(int width, int height) { 
    //ui is the GUI object declared as a field of this object 
    ui = new UI(width, height); 
    ui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    ui.setVisible(true); 
} 

eventListener de l'interface graphique crée également de nouveaux threads lorsque certains boutons sont cliqués:

public void actionPerformed(ActionEvent actionEvent) { 
    if(actionEvent.getSource().equals(ui.play)) { 
     if(clickerThread == null) { 
      autoClicker= new AutoClicker(); 
      clickerThread = new Thread(autoClicker); 
      clickerThread.start(); 
     } 
    } 
} 

Est-ce que cela signifie quand Je clique sur le bouton X de la fenêtre, tout ce qui concerne ce programme (comme le thread autoclicker, tout ce qui est dans la mémoire allouée à ce programme) est effacé et ne ralentit pas l'ordinateur à l'avenir?

Ou, est-ce que System.exit (0) serait nécessaire quelque part pour faire comme si cette application n'avait jamais été ouverte après que l'ordinateur ait démarré et fermé l'application?

Merci d'avance!

Répondre

1

par le JFrame API:

public void setDefaultCloseOperation(int operation)
Définit l'opération qui se passera par défaut lorsque l'utilisateur lance un « proche » sur ce cadre. Vous devez spécifier l'un des choix suivants:

  • DO_NOTHING_ON_CLOSE (défini dans WindowConstants): Ne faites rien; exiger que le programme gère l'opération dans la méthode windowClosing d'un objet WindowListener enregistré.
  • HIDE_ON_CLOSE (défini dans WindowConstants): masque automatiquement le cadre après l'appel des objets WindowListener enregistrés.
  • DISPOSE_ON_CLOSE (défini dans WindowConstants): masque et met automatiquement le cadre hors tension après avoir invoqué des objets WindowListener enregistrés.
  • EXIT_ON_CLOSE (défini dans JFrame): Quittez l'application à l'aide de la méthode de sortie système. Utilisez-le uniquement dans les applications.

Alors oui, cela quittera l'application en appelant System exit pour vous.


Juste un petit avertissement latéral: si votre filetage est branché correctement, et que vous avez un code de longue durée qui se passe pour attacher le fil de l'événement Swing, l'EDT, puis le bouton de fermeture de JFrame ne répondra pas avant l'EDT est débloqué.


recommandation Side 2, en ce qui concerne:

J'ai une interface graphique qui va JFrame ...

Je recommande de ne pas créer des classes qui étendent les fenêtres de haut niveau tels que JFrames depuis Cela crée des classes inflexibles qui ne peuvent être utilisées que comme JFrame. Beaucoup mieux pour adapter vos classes GUI pour créer (ou si besoin est, étendre) JPanel puisque de cette façon votre GUI peut être affichée dans de nombreux contextes différents - dans un JFrame, un JDialog, dans un autre JPanel, dans un JTabbedPanel ... libère un peu votre code.


recommandation Side 3: en ce qui concerne la création de nouveaux threads dans une application Swing, si le clicker automatique va interagir avec l'application Swing lui-même, alors vous voudrez peut-être envisager d'utiliser un SwingWorker pour aider à créer votre fil d'arrière-plan depuis cette construction comporte des mécanismes qui facilitent la communication entre le thread d'arrière-plan et l'interface graphique sans enfreindre les règles de threading Swing. Google "Concurrency in Swing" pour plus d'informations.