J'ai un problème avec mon application où l'utilisateur ouvrira plus d'une fenêtre à la fois. Et j'ai ajouté Disposer () Méthode pour appeler la fermeture de la fenêtre. Maintenant, je devrais garder au moins une fenêtre ouverte tout le temps afin que l'application ne se cache pas complètement fermée. Si vous ne comprenez pas, lisez le scénario suivant: P>
J'ai la fenêtre A et Window B ouverte en même temps. Maintenant, je peux fermer la fenêtre A ou la fenêtre B mais pas les deux. En d'autres termes, la fenêtre B doit être autorisée à se fermer uniquement si la fenêtre A est ouverte et inversement. Comment puis-je faire cela en swing ?? p>
3 Réponses :
Une approche possible ... P>
Créer une classe, appelez-le Il pourrait par exemple conserver le compteur em> des fenêtres actuellement ouverts et autoriser une opération de disposition uniquement s'il y a plusieurs fenêtres "vivantes", sinon montrez un message de confirmation avec La partie "délicate" est que vous devez faire ce genre d'opérations liées à la fenêtre tout au long de la fenêtre code> code>, sinon tout va bousiller. P>
Dunno Si Swing a quelque chose comme ça, je n'ai jamais vu un tel scénario. P> WindowManager code>, qui gère la création et la mise à disposition des fenêtres. P>
JOPTIONPANE Code> Dire à l'utilisateur "Vraiment proche? Cela mettrait fin à la demande." ou quelque chose comme ça. P>
La partie "Tricky" est que vous devez effectuer une opération liée à la fenêtre dans tout le monde, sinon tout serait bousiller. Code> Que voulez-vous dire par ceci? J'ai compris les opérations liées à la fenêtre TAT comme ouverture et fermeture. Dois-je m'inquiéter de redimensionner, de vous déplacer, etc.?
Non non, je venais de pointer sur le fait que lorsque l'utilisateur clique sur le bouton "X" de la fenêtre, vous devez gérer cela dans la classe de la fenêtre, puis déléguer à la fenêtre WindowManager code> le réel logique de l'opération. C'est un peu délicat, mais fonctionne. Et plus, lorsqu'un nouveau doit être créé, cela doit être fait par le gestionnaire ou au moins notifié au gestionnaire. Un peu ennuyeux. [édité la réponse]
Laissez-moi voir si je peux trouver des caractéristiques intégrées ... Si aucun autre aller, je devrais mettre en œuvre votre idée .. M'avertir si vous trouvez quelque chose de relativement plus facile .. Merci !!
Vérifiez simplement si l'autre fenêtre est ouverte avant la fermeture avec la fenêtre.isvissible (); P>
Un simple type de fenêtres n'est pas vraiment délicat, tout ce dont vous avez besoin est
Quelques extrait: P>
// the listener (aka: WindowManager)
WindowListener l = new WindowAdapter() {
List<Window> windows = new ArrayList<Window>();
@Override
public void windowOpened(WindowEvent e) {
windows.add(e.getWindow());
}
@Override
public void windowClosing(WindowEvent e) {
if (windows.size() > 1) {
windows.remove(e.getWindow());
e.getWindow().dispose();
}
}
};
// create the first frame
JFrame frame = createFrame(l);
frame.setVisible(true);
// a method to create a new window, config and add the listener
int counter = 0;
private JFrame createFrame(final WindowListener l) {
Action action = new AbstractAction("open new frame: " + counter) {
@Override
public void actionPerformed(ActionEvent e) {
JFrame frame = createFrame(l);
frame.setVisible(true);
}
};
JFrame frame = new JFrame("someFrame " + counter++);
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.add(new JButton(action));
frame.addWindowListener(l);
frame.pack();
frame.setLocation(counter * 20, counter * 10);
return frame;
}
+1 pour action code> .
Si vous essayez de garder une trace de plusieurs fenêtres, une classe WindowManager implémentée avec le modèle Singleton pourrait être utile.