IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Agents de placement/Fenêtres Java Discussion :

JAVA : Fermeture de plusieurs fenêtres


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 5
    Points
    5
    Par défaut JAVA : Fermeture de plusieurs fenêtres
    Fermeture de plusieurs fenêtres.

    Je fais appel à vos connaissances et à votre expérience pour m’aider à résoudre le problème suivant :

    CONTEXTE

    J’ai une fenêtre dite « Statistiques » qui à l’aide d’un bouton AIDE permet d’accéder à une seconde fenêtre « aide_statistiques ». Elles sont dans le même pack.

    1/ Dans la public class aide_statistiques, la fenêtre « aide_statistiques » est executée de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     public void run()
    {
    	try
    	{
    		aide_statistiques frame1 = new aide_statistiques();
    		frame1.setVisible(true);
    	} 
    catch (Exception e)
    {
    		e.printStackTrace();
    	}
    }
    2/ Dans la public class Statistiques, elle est appelée lorsqu’on clique sur le bouton « Aide ». La fenêtre appelante demeure affichée comme souhaité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    JButton btnAide = new JButton("Aide");
    btnAide.addActionListener(new ActionListener()	
    {
    	public void actionPerformed(ActionEvent e)
    	{
    		aide_statistiques frame1 = new aide_statistiques();
    		frame1.setVisible(true);
    	}			
     
    });
    btnAide.setBounds(17, 529, 117, 29);
    contentPane_1.add(btnAide);
    3/ Dans « aide_statistiques », le retour vers « Statistiques » s’effectue en cliquant sur un bouton « Retour ».
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // ------- Bouton Retour vers Statistiques------------------
     
    JButton btnRetour = new JButton("Retour");
    btnRetour.addActionListener(new ActionListener()
    {
    	public void actionPerformed(ActionEvent e)
    	{
    		dispose();
    	}
    });
    btnRetour.setBounds(157, 439, 117, 29);
    contentPane.add(btnRetour);
    Ce code fonctionne parfaitement, la fenêtre « aide_statistiques » se ferme normalement, la fenêtre « Statistiques » reste affichée.

    PROBLEME

    Dans l’hypothèse où l’on n’a pas cliqué sur « Retour », je souhaite pouvoir fermer les deux fenêtres « Statistiques » et « aide_statistiques », lorsque l’on clique sur le bouton retour (vers le menu principal) de la fenêtre « Statistiques ».

    Le code suivant dans "Statistiques" ne fonctionne pas. La fenêtre « Statistiques » se ferme correctement, par contre la fenêtre « aide_statistiques » demeure toujours ouverte !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    // --------------------------------------------------
    //            Retour vers MENU PRINCIPAL
    // --------------------------------------------------
     
    JButton btnNewButton_1 = new JButton("Retour");
    btnNewButton_1.addActionListener(new ActionListener()
    {
    	public void actionPerformed(ActionEvent e)
    	{				
     
    	// -- Fermeture AIde : Ne marche pas (14/10/2019) -
     
    	aide_statistiques frame1 = new aide_statistiques();
    	frame1.setVisible(false);
    	frame1.dispose();
     
           // ------------------------------------------------
     
    	dispose();	// Fermeture de Statistiques
     
    }
    });
    btnNewButton_1.setBounds(671, 529, 117, 29);
    contentPane_1.add(btnNewButton_1);

    Je vous remercie de votre aide.

    Cordialement.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu devrais regarder le moyen de faire du MDA (Multi Document Application) (qui utilise des JInternalFrame) qui permet de mieux gérer des applications avec plusieurs fenêtres.

    Avec des JFrame on peut toutefois faire quelque chose de similaire avec une petite classe utilitaire qui permet de retrouver une JFrame par sa classe, en partant du principe qu'une seule JFrame de classe X est affichée à la fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    import java.awt.Frame;
     
    import javax.swing.JFrame;
     
    public class FrameUtils {
     
    	public static <T extends JFrame> T getFrame(Class<T> frameClass) {
    		for(Frame frame : JFrame.getFrames()) {
    			if ( frameClass.isInstance(frame) ) {
    				if ( frame.isDisplayable() ) {
    				return frameClass.cast(frame);
    				}
    			}
    		}
    		return null;
    	}
     
    }
    Une petite démo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class MultiFrameTest {
     
    	public static void main(String[] args) {
     
    		new Frame1();
     
     
    	}
     
     
    	public static class Frame1 extends JFrame {
    		public Frame1() {
     
    			JPanel jpanel = new JPanel(new GridBagLayout());
    			GridBagConstraints gbc = new GridBagConstraints();
    			gbc.gridx=0;
    			gbc.insets=new Insets(5, 5, 5, 5);
    			JButton frame2Button = new JButton("Ouvrir frame 2");
    			frame2Button.addActionListener(e-> {
    				Frame2 frame = FrameUtils.getFrame(Frame2.class);
    				// si la frame existe déjà on la monte au premier plan, sinon on la créé 
    				if ( frame==null ) {
    					new Frame2();
    				}
    				else {
    					frame.toFront();
    				}
    			});
    			JButton frame3Button = new JButton("Ouvrir frame 3");
    			frame3Button.addActionListener(e-> {
    				Frame3 frame = FrameUtils.getFrame(Frame3.class);
    				// si la frame existe déjà on la monte au premier plan, sinon on la créé 
    				if ( frame==null ) {
    					new Frame3();
    				}
    				else {
    					frame.toFront();
    				}
    			});
    			jpanel.add(frame2Button,gbc);
    			jpanel.add(frame3Button,gbc);
    			add(jpanel);
    			setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    			setSize(200,200);
    			setLocation(200,200);
    			setVisible(true);
    		}
    	}
    	public static class Frame2 extends JFrame {
     
    		public Frame2() {
    			JPanel jpanel = new JPanel(new GridBagLayout());
    			JButton retourButton = new JButton("Retour");
    			retourButton.addActionListener(e-> {
    			   dispose(); // ferme cette fenêtre	
    			});
    			jpanel.add(retourButton);
    			add(jpanel);
    			setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    			addWindowListener(new WindowAdapter() {
    				@Override
    				public void windowClosed(WindowEvent e) {
    					// ceci permet de disposer la frame3 si on ferme la fenêtre par le bouton [x]
    					   Frame3 frame3 = FrameUtils.getFrame(Frame3.class);
    					   // si la frame3 existe on la dispose
    					   if ( frame3!=null ) {
    						   frame3.dispose();
    					   }
    				}
    			});
    			setSize(200,200);
    			setLocation(400,200);
    			setVisible(true);
    		}
     
    	}
    	public static class Frame3 extends JFrame {
     
    		public Frame3() {
    			setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    			setSize(200,200);
    			setLocation(400,400);
    			setVisible(true);
    		}
    	}
     
    }
    On pourrait procéder de façon plus dédiée en passant les références de chaque fenêtre entre les fenêtres et en utilisant les événements de fenêtre, mais ça devient beaucoup plus complexe au final.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Fermeture plusieurs fenêtres
    Bonsoir,

    J'ai étudié le code que tu m'as communiqué, j'ai bien compris l'économie générale, je l'ai testé et je l'ai implanté dans mon logiciel.

    Cela fonctionne parfaitement et cela correspond pleinement à ma demande.

    J'ai bien compris l'objet du module FrameUtils, mais je me dois toutefois de préciser que certaines formulations "m'échappent" encore,
    notamment la ligne public static <T extends JFrame ...., mon niveau de connaissance est encore limité dans ce domaine !

    Encore, merci d'avoir bien voulu m'aider, c'est très sympa.

    Bien cordialement.

  4. #4
    Membre régulier Avatar de abdennour bouaicha
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2009
    Messages : 98
    Points : 112
    Points
    112
    Par défaut
    essai ce code ,s'il n'est pas bon on est prêt pour le corriger et répondre à votre question, ou même rédiger un autre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    package statistique;
     
    import java.awt.Color;
    import java.awt.Rectangle;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class statistique {
        private JFrame           fr_stat = new JFrame( "statistique" );
        private JPanel           panel   = new JPanel();
        private Rectangle        r       = new Rectangle( 0, 0, 1000, 1000 );
        private Color            c       = Color.BLUE;
        private aide_statistique fr_help;
     
        public statistique() {
            fr_stat.getContentPane().setBackground( Color.BLUE );
            fr_stat.setBackground( c );
            fr_stat.setDefaultCloseOperation( fr_stat.EXIT_ON_CLOSE );
            fr_stat.setSize( 1000, 1000 );
            fr_stat.setVisible( true );
            fr_stat.getContentPane().setLayout( null );
            fr_stat.setLocationRelativeTo( null );
            panel.setBounds( r );
            panel.setBackground( c );
            panel.setBorder( null );
            panel.setLayout( null );
            fr_stat.getContentPane().add( panel );
            fr_help = new aide_statistique( this );
     
            JButton help = new JButton( "aide statistique" );
            help.addActionListener( new ActionListener() {
                public void actionPerformed( ActionEvent e ) {
                    fr_help.toStart();
                    toSleep();
                }
            } );
            help.setBounds( 66, 62, 260, 67 );
            panel.add( help );
            JButton menu = new JButton( "menu principale" );
            menu.addActionListener( new ActionListener() {
                public void actionPerformed( ActionEvent e ) {
                    fr_stat.dispose();
                }
            } );
            menu.setBounds( 66, 162, 260, 67 );
            panel.add( menu );
            panel.repaint();
            panel.revalidate();
        }
     
        public void toStart() {
            fr_stat.setVisible( true );
        }
     
        public void toSleep() {
            fr_stat.setVisible( false );
        }
     
        public static void main( String[] args ) {
            new statistique();
        }
     
    }
     
    class aide_statistique {
        private JFrame    fr_help = new JFrame( "aide statistique" );
        private JPanel    panel   = new JPanel();
        private Rectangle r       = new Rectangle( 0, 0, 1000, 1000 );
        private Color     c       = Color.red;
     
        public aide_statistique( final statistique fr_stat ) {
            fr_help.getContentPane().setBackground( Color.BLUE );
            fr_help.setBackground( c );
            fr_help.setDefaultCloseOperation( fr_help.EXIT_ON_CLOSE );
            fr_help.setSize( 1000, 1000 );
            fr_help.setVisible( false );
            fr_help.getContentPane().setLayout( null );
            fr_help.setLocationRelativeTo( null );
            panel.setBounds( r );
            panel.setBackground( c );
            panel.setBorder( null );
            panel.setLayout( null );
            fr_help.getContentPane().add( panel );
            JButton retour = new JButton( "retour" );
            retour.addActionListener( new ActionListener() {
                public void actionPerformed( ActionEvent e ) {
                    fr_stat.toStart();
                    toSleep();
                }
            } );
            retour.setBounds( 66, 62, 260, 67 );
            panel.add( retour );
        }
     
        public void toStart() {
            fr_help.setVisible( true );
        }
     
        public void toSleep() {
            fr_help.setVisible( false );
        }
    }

  5. #5
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonsoir,

    Ok, merci pour votre aide. C'est super, je vais le tester très rapidement.

    Cordialement.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonsoir,

    J'ai testé le code que vous m'avez proposé mais il ne semble pas répondre totalement à ma demande, sauf incompréhension de ma part,
    ce qui est fort possible compte tenu de mon peu d'expérience en JAVA .De plus, ma demande était vraisemblablement mal formulée.

    Toutefois, je vous remercie d'avoir bien voulu me donner un coup de main, c'était très sympa de votre part !

    Pour information, j'ai reçu une autre réponse qui correspond pleinement à ma demande et qui m'a permis
    de résoudre mon problème.

    Merci encore, bien cordialement.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Décembre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2018
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Fermeture de plusieurs fenêtres
    Bonsoir,

    Tous mes remerciements pour vos réponses, mon problème est résolu avec l'aide du code transmis par joel.drigo.

    Bien cordialement.

Discussions similaires

  1. [QtGui] PyQt - Gérer la fermeture de plusieurs fenêtres
    Par Mimisator dans le forum PyQt
    Réponses: 7
    Dernier message: 24/01/2019, 20h45
  2. [WD12] Renvoyer plusieurs valeurs à la fermeture d'une fenêtre
    Par Gaetch dans le forum WinDev
    Réponses: 17
    Dernier message: 19/02/2009, 11h20
  3. [JFrame]Fermeture de plusieurs fenêtres en même temps
    Par Core8 dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 28/12/2006, 16h47
  4. executer une fonction à la fermeture d'une fenêtre
    Par Oluha dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 22/02/2005, 09h46
  5. Arrêter un ttmt en cours, lors de la fermeture d'une fenêtre
    Par teska dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/12/2004, 14h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo