Frame.dispose

CR16 - Modifié le 7 juin 2023 à 14:04
CR16_Padawan Messages postés 56 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 30 avril 2024 - 7 juin 2023 à 19:52

Bonjour,

Je commence le codage java et je souhaiterai savoir comment utiliser le "frame.dispose".

J'utilise 2 frames (pour le moment), sur le premier il y a un bouton qui permet l'ouverture du deuxième et je voudrais qu'il puisse en même temps fermer le premier.

le problème est que je ne sais pas où mettre le code de fermeture. j'ai regarder à gauche à droite mais pas de réponse a ma question.

quelqu'un pourrait il m'aider?

Merci par avance.

Codes actuellement en place:

MainTest

package fr.XX.maintest;

    import javax.swing.SwingUtilities;

    public class MainTest {
        
        public static void main(String[] args) {
                    
            SwingUtilities.invokeLater(new Runnable() {
                public void run () {
                    new FrameTest("Test");
                    }
                
            });
    }
        

}

PanelTest

package fr.XX.maintest;


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JPanel;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////    

    public class PanelTest extends JPanel{
    
        private static final long serialVersionUID = 1L;
        
        public static 
        int index = 0;
        //int h = 20; // hauteur d'un label, textbox, 
        //int dg = 5; // point départ gauche
        //int dh = 5; // point départ haut
        //int L = 5;
            

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////        


    public PanelTest() {
        
        
                                            // Initialiser les composants

    
// BUTTON
    
    JButton valide = new JButton("Album photos =>");
    valide.addActionListener( new ActionListener() {
        public void actionPerformed(ActionEvent e) {
        new Frame2Test("Album Photos");

           }
});


    add(valide);
    
    
    }    
    
    }

FrameTest

package fr.XX.maintest;


import javax.swing.JFrame;


public class FrameTest extends JFrame {

    private static final long serialVersionUID = 1L;
    
    public FrameTest(String title) {
    setTitle(title);
    setSize(450, 500); // Taille de la fenêtre
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //termine l'execution du programme
    setResizable(false); // Empéche le redimensionnement manuel de la fenêtre
    setLocationRelativeTo(null); // Affiche la fenêtre au milieu de l'écran
    setVisible(true); // true = affiche la fenêtre

    add ( new PanelTest());
    }
    
}

Frame2Test

package fr.XX.maintest;

import javax.swing.JFrame;

public class Frame2Test extends JFrame {

    private static final long serialVersionUID = 1L;
    
    public Frame2Test(String title) {
    setTitle(title);
    setSize(450, 500); // Taille de la fenêtre
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //termine l'execution du programme
    setResizable(false); // Empéche le redimensionnement manuel de la fenêtre
    setLocationRelativeTo(null); // Affiche la fenêtre au milieu de l'écran
    setVisible(true); // true = affiche la fenêtre
    
    //add ( new Panel());
    }
}


Windows / Edge 114.0.1823.37

3 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié le 7 juin 2023 à 14:59

Bonjour,

Pour répondre rapidement à la question, tu peux modifier comme ceci :

FrameTest :
add(new PanelTest()); → add(new PanelTest(this));

PanelTest :
public PanelTest() { → public PanelTest(FrameTest frameTest) {
new Frame2Test("Album Photos"); → new Frame2Test("Album Photos"); frameTest.dispose();

Pour aller plus loin, il y a le modèle vue-contrôleur (MVC), dans ton cas tu aurais un objet (le contrôleur) qui aurait accès à toutes les frames (la vue) de sorte que lorsque tu appuies sur le bouton c'est le contrôleur qui est appelé pour qu'il affiche une frame et en masque une autre.

Exemple de code qui reprends tes fenêtres mais avec une classe contrôleur :

public class Main {
    public static void main(String[] args) {
        Controller.start();
    }
}
public class Controller {
    private static Frame1 frame1;
    private static Frame2 frame2;

    public static void start() {
        frame1 = new Frame1("Test");
        frame1.setVisible(true);
    }

    public static void boutonAlbumPhotos(Object obj) {
        frame2 = new Frame2("Album Photos");
        frame2.setVisible(true);
        frame1.dispose();
    }
}
import javax.swing.*;

public abstract class AbstractFrame extends JFrame {
    public AbstractFrame(String title) {
        setTitle(title);
        setSize(450, 500);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setLocationRelativeTo(null);
    }
}
public class Frame1 extends AbstractFrame {
    public Frame1(String title) {
        super(title);
        add(new PanelFrame1());
    }
}
public class Frame2 extends AbstractFrame {
    public Frame2(String title) {
        super(title);
    }
}
import javax.swing.*;

public class PanelFrame1 extends JPanel {
    public PanelFrame1() {
        JButton valide = new JButton("Album photos =>");
        valide.addActionListener(Controller::boutonAlbumPhotos);
        add(valide);
    }
}

0
CR16_Padawan Messages postés 56 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 30 avril 2024
7 juin 2023 à 16:26

Bonjour KX !

Merci pour ce retour rapide.

J'ai testé la proposition 1 (rapide) et ça fonctionne super!

Pour la version 2 (poussé), je dois mettre:

#1 
"public class Main {"  => dans la class MainTest 

#2

"public class Controller {"     => dans la class MainTest 

#3 

"public abstract class AbstractFrame extends JFrame {" => dans la class FrameTest

#4 

"public class Frame1 extends AbstractFrame {"  => dans la class PanelTest

#5 

"public class Frame2 extends AbstractFrame {"  => dans la class PanelTest

#6 

"public class PanelFrame1 extends JPanel {"  => dans la class PanelTest

Peux-tu me dire ce que signifie l'astérisque juste après Swing. ?

Désolé pour ces questions mais j'essaie de comprendre le fonctionnement.

Merci pour ta compréhension

Voilà ce que j'ai fait.

MAINTEST

package fr.XX.maintest;

	//import javax.swing.SwingUtilities;

	public class MainTest {
		
		public static void main(String[] args) {
					
			Controller.start();
				
		
	}
		
		public static class Controller {
		    private static FrameTest frame1;
		    private static Frame2Test frame2;

		    public static void start() {
		        frame1 = new FrameTest("Test");
		        frame1.setVisible(true);
		    }

		    public static void boutonAlbumPhotos(Object obj) {
		        frame2 = new Frame2Test("Album Photos");
		        frame2.setVisible(true);
		        frame1.dispose();
		    }
		    
		    
		}
		
}

 PANELTEST

package fr.XX.maintest;


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JPanel;

import fr.XX.maintest.MainTest.Controller;



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	



public class PanelFrame1 extends JPanel {
    public PanelFrame1() {
        JButton valide = new JButton("Album photos =>");
        valide.addActionListener(Controller::boutonAlbumPhotos);
        add(valide);
    }

			

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////		


public class Frame1 extends AbstractFrame {
    public Frame1(String title) {
        super(title);
        add(new PanelFrame1());
    }
}
public class Frame2 extends AbstractFrame {
    public Frame2(String title) {
        super(title);
    }
}
	}

FRAMETEST

package fr.XX.maintest;


import javax.swing.JFrame;


public abstract class AbstractFrame extends JFrame {
    public AbstractFrame(String title) {
        setTitle(title);
        setSize(450, 500);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        setLocationRelativeTo(null);
    }
}
}
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
7 juin 2023 à 18:48

"Pour la version 2 (poussé), je dois mettre"

Une public class doit toujours être dans un fichier .java qui porte le nom de la classe, donc public class Main => Main.java, public class Controller => Controller.java, etc.

J'ai choisi des noms de classe différents des tiennes pour que tu puisses garder les deux séries de fichiers en parallèle et comparer.

"Peux-tu me dire ce que signifie l'astérisque juste après Swing. ?"

En informatique, l'astérisque est souvent utilisé comme wildcard (caractère générique) pour représenter "tout ce qu'il est possible d'avoir", par exemple en SQL on fera des requêtes SELECT * pour récupérer toutes les colonnes de résultats.

Un import javax.swing.*; signifie que l'on importe tout ce qui est dans le package javax.swing, ça évite de devoir faire plusieurs lignes d'import pour JFrame, JPanel, JButton, etc.

Remarque : attention aux ambiguïtés si on fait plusieurs import * parce qu'autant on est sûr que dans un package toutes les classes seront uniques, autant dans deux packages différents il peut y avoir des classes de même nom (l'une dans un package et la deuxième dans l'autre).

Exemple : si on fait un import java.awt.* et un import java.util.* on ne peut pas utiliser la classe List car elle existe dans les deux packages, dans ce cas on est obligé de toujours mettre java.awt.List ou java.util.List avec le nom complet du package, mais pas List tout court.

0
CR16_Padawan Messages postés 56 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 30 avril 2024
7 juin 2023 à 19:52

Merci KX,

tu es très pédagogue, Tu as prit le temps de me répondre et de m'expliquer.

Je ferais les tests plus tard et si j'ai de nouveau un soucis je reviendrais prendre de tes lumières.

Bonne soirée et à bientôt;

0