Quelle est la bonne façon d'obtenir une JFrame
fermeture, la même chose que si l'utilisateur avait X
appuyé sur le bouton de fermeture ou appuyé sur Alt+ F4(sous Windows)?
J'ai mon opération de fermeture par défaut définie comme je le souhaite, via:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Il fait exactement ce que je veux avec les commandes susmentionnées. Cette question n'est pas à ce sujet.
Ce que je veux vraiment faire, c'est que l'interface graphique se comporte de la même manière qu'une pression sur le X
bouton de fermeture la ferait se comporter.
Supposons que je devais étendre WindowAdaptor
puis ajouter une instance de mon adaptateur comme écouteur via addWindowListener()
. Je voudrais voir la même séquence d'appels à travers windowDeactivated()
, windowClosing()
et windowClosed()
comme cela se produirait avec le X
bouton de fermeture. Pas tant pour déchirer la fenêtre que pour lui dire de se déchirer, pour ainsi dire.
Réponses:
Si vous souhaitez que l'interface graphique se comporte comme si vous avez cliqué sur le
X
bouton Fermer, vous devez envoyer un événement de fermeture de fenêtre auWindow
. ÀExitAction
partir de la fermeture d'une application, vous pouvez ajouter cette fonctionnalité à un élément de menu ou à tout composant qui utiliseAction
facilement s.la source
Pas trop compliqué.
la source
Si par Alt-F4 ou X vous voulez dire "Quittez l'application immédiatement sans tenir compte des autres fenêtres ou threads en cours d'exécution", alors vous
System.exit(...)
ferez exactement ce que vous voulez d'une manière très abrupte, brutale et éventuellement problématique.Si par Alt-F4 ou X vous voulez dire cacher la fenêtre,
frame.setVisible(false)
c'est comme ça que vous "fermez" la fenêtre. La fenêtre continuera à consommer des ressources / mémoire mais peut être rendue visible à nouveau très rapidement.Si par Alt-F4 ou X vous voulez dire cacher la fenêtre et disposer de toutes les ressources qu'elle consomme, alors
frame.dispose()
comment "fermer" la fenêtre. Si le cadre était la dernière fenêtre visible et qu'aucun autre thread non démon n'est en cours d'exécution, le programme se fermera. Si vous affichez à nouveau la fenêtre, elle devra réinitialiser à nouveau toutes les ressources natives (tampon graphique, poignées de fenêtre, etc.).dispose()
pourrait être le plus proche du comportement que vous voulez vraiment. Si votre application a plusieurs fenêtres ouvertes, voulez-vous que Alt-F4 ou X quitte l'application ou ferme tout simplement la fenêtre active?Le tutoriel Java Swing sur les écouteurs de fenêtre peut aider à clarifier les choses pour vous.
la source
Si vous avez fait cela pour vous assurer que l'utilisateur ne peut pas fermer la fenêtre:
Ensuite, vous devez changer votre
pullThePlug()
méthode pour êtreJ'ai trouvé que c'était la seule façon de bien jouer avec
WindowListener
etJFrame.DO_NOTHING_ON_CLOSE
.la source
Voici vos options:
la source
Quitter le processus d'exécution Java est très simple, vous devez simplement faire deux choses simples:
System.exit(...)
au point de fermeture de l'application. Par exemple, si votre application est basée sur un cadre, vous pouvez ajouter un écouteurWindowAdapter
et appelerSystem.exit(...)
dans sa méthodewindowClosing(WindowEvent e)
.Remarque: vous devez appeler
System.exit(...)
sinon votre programme est une erreur impliquée.System.exit(...)
au bon moment, mais cela ne signifie pas que la méthode peut toujours être appelée, car des exceptions Java inattendues peuvent empêcher l'appel de la méthode.Ceci est fortement lié à vos compétences en programmation.
** Voici un exemple le plus simple (
JFrame
basé) qui vous montre comment appeler la méthode de sortiela source
Non seulement pour fermer le JFrame mais aussi pour déclencher des événements WindowListener, essayez ceci:
la source
La meilleure façon de fermer un cadre Swing par programmation est de le faire se comporter comme il le ferait lorsque le bouton "X" est enfoncé. Pour ce faire, vous devrez implémenter WindowAdapter qui convient à vos besoins et définir l'opération de fermeture par défaut du cadre pour ne rien faire (DO_NOTHING_ON_CLOSE).
Initialisez votre cadre comme ceci:
Vous pouvez fermer le cadre par programme en lui envoyant l'événement WINDOW_CLOSING, comme ceci:
Cela fermera le cadre comme si le bouton "X" était enfoncé.
la source
Si vous ne voulez vraiment pas que votre application se termine lorsqu'un JFrame est fermé, alors,
utilisation :
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
au lieu de :
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Voici un synopsis de ce à quoi ressemble la solution,
la source
Cette réponse a été donnée par Alex et je voudrais la recommander. Cela a fonctionné pour moi et une autre chose est simple et si simple.
la source
Cet exemple montre comment réaliser l'opération de fermeture de fenêtre confirmée.
La fenêtre possède un adaptateur de fenêtre qui bascule l'opération de fermeture par défaut vers
EXIT_ON_CLOSE
ou enDO_NOTHING_ON_CLOSE
fonction de votre réponse dans leOptionDialog
.La méthode
closeWindow
deConfirmedCloseWindow
déclenche un événement de fermeture de fenêtre et peut être utilisée n'importe où, c'est-à-dire comme action d'un élément de menula source
Sur la base des réponses déjà fournies ici, voici comment je l'ai implémenté:
Le JFrame obtient la fermeture de l'événement et à la fermeture, quitte.
la source
Vous devez insérer l'appel dans la file d'attente de messages AWT pour que tout le timing se déroule correctement, sinon il ne distribuera pas la séquence d'événements correcte, en particulier dans un programme multithread. Lorsque cela est fait, vous pouvez gérer la séquence d'événements résultante exactement comme vous le feriez si l'utilisateur a cliqué sur le bouton [x] pour un JFrame décoré fourni par le système d'exploitation.
la source
J'ai essayé cela, écrivez votre propre code pour l' événement formWindowClosing () .
Cela demande à l'utilisateur s'il souhaite quitter le cadre ou l'application.
la source
Publier ce qui était dans le corps de la question comme réponse CW.
Je voulais partager les résultats, principalement dérivés du lien suivant de camickr. Fondamentalement, je dois lancer un
WindowEvent.WINDOW_CLOSING
dans la file d'attente d'événements de l'application. Voici un synopsis de ce à quoi ressemble la solutionla source
Si vous ne souhaitez pas que votre application se termine à la fermeture d'un JFrame, utilisez: setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE)
au lieu de: setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
De la documentation:
DO_NOTHING_ON_CLOSE (defined in 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 (defined in WindowConstants)
: Masquer automatiquement le cadre après avoir appelé tous les objets WindowListener enregistrés.DISPOSE_ON_CLOSE (defined in WindowConstants)
: Masque et supprime automatiquement le cadre après avoir appelé tous les objets WindowListener enregistrés.EXIT_ON_CLOSE (defined in JFrame)
: Quittez l'application à l'aide de la méthode de sortie du système. Utilisez-le uniquement dans les applications.peut encore être utile: vous pouvez utiliser
setVisible(false)
sur votre JFrame si vous souhaitez afficher à nouveau le même cadre. Sinon, appelezdispose()
pour supprimer toutes les ressources d'écran natives.copié de Peter Lang
https://stackoverflow.com/a/1944474/3782247
la source
la source
setVisible(false)
.setVisible(false); .setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);