9
votes

Comment puis-je trouver si une fenêtre est ouverte sur Swing

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:

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 ??


0 commentaires

3 Réponses :


4
votes

Une approche possible ...

Créer une classe, appelez-le WindowManager , qui gère la création et la mise à disposition des fenêtres.

Il pourrait par exemple conserver le compteur 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 JOPTIONPANE Dire à l'utilisateur "Vraiment proche? Cela mettrait fin à la demande." ou quelque chose comme ça.

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 , sinon tout va bousiller.

Dunno Si Swing a quelque chose comme ça, je n'ai jamais vu un tel scénario.


3 commentaires

La partie "Tricky" est que vous devez effectuer une opération liée à la fenêtre dans tout le monde, sinon tout serait bousiller. 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 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 !!



1
votes

Vérifiez simplement si l'autre fenêtre est ouverte avant la fermeture avec la fenêtre.isvissible ();


0 commentaires

16
votes

Un simple type de fenêtres n'est pas vraiment délicat, tout ce dont vous avez besoin est

  • WindowListener qui garde les traces des fenêtres qu'il écoute li>
  • Un lieu défini pour créer les fenêtres et enregistrer l'écoute li>
  • Faites que les fenêtres ne soient pas à rien et rendez l'auditeur responsable de la décision de la fermeture ou non (le fera pour toutes les dernières) li> ul>

    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;
        }
    


2 commentaires

+1 pour action .


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.