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

AWT/Swing Java Discussion :

Fermer une fenêtre avec un bouton


Sujet :

AWT/Swing Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Décembre 2014
    Messages : 12
    Points : 2
    Points
    2
    Par défaut Fermer une fenêtre avec un bouton
    Bonjour,
    j’essaye de me dépatouiller avec swing.

    je créé une fenêtre, contenant un tableau, que l'utilisateur peut modifier.
    Et quand j'appuie sur un bouton, je traite les données et je voudrait que la fenetre se ferme.

    j'ai donc une classe pour ma fenêtre :

    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
     
    public class TableauMax extends JFrame {
     
    	public static JTable tableau;
    	public static JFrame fenetremax;	
     
    	// création de la fenetre
    	public TableauMax(){
    		setDefaultCloseOperation(this.DISPOSE_ON_CLOSE);
    		this.setLocation(15,15);
    	    this.setTitle("Charge Max");
    	    this.setSize(600, 600);
     
    //  je vous passe les détails de la création des données par défaut du tableau
     
    this.tableau = new JTable(data, title);
    	    this.tableau.setRowHeight(30);
    	    this.getContentPane().add(new JScrollPane(tableau), BorderLayout.CENTER);
     
    	   // affichage du bouton validation
     
    	    JPanel boutonPane = new JPanel();
    	    JButton bouton = new JButton(new ValiderModif("Valider les modifications"));
     
    	    boutonPane.add(bouton);
    	    this.getContentPane().add(boutonPane, BorderLayout.SOUTH);
     
     
      }
     
    }
    et une classe pour l'action à réaliser lorsque l'on clique sur le bouton
    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
     
     
    public class ValiderModif extends AbstractAction {
    	public ValiderModif(String texte){
    		super(texte);
    	}
     
     
     
    	public void actionPerformed(ActionEvent e) { 
     
    			// récupération et traitements des valeurs éventuellement modifiées de la JTable de la fenetre TableauMax
     
     
    			// fermeture de la fenetre TableauMax.
     
    			TableauMax.tableau.setVisible(false);
    			TableauMax.dispose();
     
    	}
    }
    j'arrive à rentre le tableau non visible, mais je n'arrive pas à fermer la fenêtre . je n'arrive pas à utiliser le dispose().


    auriez vous un indice pour moi?

  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,

    La méthode dispose() de la classe JFrame n'est pas une méthode statique : c'est une méthode d'instance, et, donc, il te faut une instance de jframe pour pouvoir appeler cette méthode pour cette instance. Pour pouvoir avoir accès à l'instance de JFrame dans la classe, passe-là en argument du constructeur de et stocke là dans l'instance

    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
    public class ValiderModif extends AbstractAction {
     
            private final TableauMax frame; // pour stocker l'instance de JFrame
     
    	public ValiderModif(String texte, TableauMax frame){
    		super(texte);
                    this.frame=frame;
    	}
     
    	public void actionPerformed(ActionEvent e) { 
     
    			// récupération et traitements des valeurs éventuellement modifiées de la JTable de la fenetre TableauMax
     
     
    			// fermeture de la fenetre TableauMax.
     
    			frame.dispose(); 
     
    	}
    }
    Par ailleurs, ta variable tableau, n'a pas a être static : il s'agit d'un composant propre à une instance de TableauMax. En passant la frame à l'action ValidModif, tu peux avoir accès à l'instance de JTable par frame.tableau dans actionPerformed, puisqu'elle est public.

    A priori, fenetremax ne sert à rien. D'une manière général, n'utilise pas de static (sauf pour final static, pour avoir des constantes de référence, et pour la méthode main()) : on peut toujours s'en passer, et c'est une bonne habitude à prendre. Ensuite, dans les cas où ça sera vraiment indispensable, plus tard, quand tu feras des applications plus complexe, tu sauras mieux décider quand l'utiliser de manière exceptionnelle.

    Ensuite, pour simplifier la problématique d'accès aux méthode de la frame ou des composants qui s'y trouvent (la table par exemple), il est plus simple d'utiliser une classe interne, et plus logique également : en effet, l'actionlistener est tellement lié à ce qu'il y a dans la frame qu'il y a peu de chance qu'il soit utilisable dans un autre contexte, en l'état, en tout cas.

    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
    public class TableauMax extends JFrame {
     
            private final JTable tableau;
     
    	// création de la fenetre
    	public TableauMax(){
    	    setDefaultCloseOperation(this.DISPOSE_ON_CLOSE);
    	    this.setLocation(15,15);
    	    this.setTitle("Charge Max");
    	    this.setSize(600, 600);
     
                //  je vous passe les détails de la création des données par défaut du tableau
     
                tableau = new JTable(data, title);
    	    tableau.setRowHeight(30);
    	    getContentPane().add(new JScrollPane(tableau), BorderLayout.CENTER);
     
    	    // affichage du bouton validation
     
    	    JPanel boutonPane = new JPanel();
    	    JButton bouton = new JButton("Valider les modifications");
                bouton.addActionListener( new ValiderModif() );
     
    	    boutonPane.add(bouton);
    	    this.getContentPane().add(boutonPane, BorderLayout.SOUTH);
     
      }
     
      private class ValiderModif extends ActionListener (
          public void actionPerformed(ActionEvent event) {
     
               // faire ce que tu veux avec les données de la table
               // par exemple :
               int rowCount = tableau.getRowCount();
     
     
               // fermer la fenêtre
               dispose(); // la classe interne a accès directe au méthode de la classe qui la contient (TableauMax)
     
          }
      }
     
    }
    En Java 8, tu peux te passer de classe interne en utilisant une expression lambda :

    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
    public class TableauMax extends JFrame {
     
            private final JTable tableau;
     
    	// création de la fenetre
    	public TableauMax(){
    	    setDefaultCloseOperation(this.DISPOSE_ON_CLOSE);
    	    this.setLocation(15,15);
    	    this.setTitle("Charge Max");
    	    this.setSize(600, 600);
     
                //  je vous passe les détails de la création des données par défaut du tableau
     
                tableau = new JTable(data, title);
    	    tableau.setRowHeight(30);
    	    getContentPane().add(new JScrollPane(tableau), BorderLayout.CENTER);
     
    	    // affichage du bouton validation
     
    	    JPanel boutonPane = new JPanel();
    	    JButton bouton = new JButton("Valider les modifications");
                bouton.addActionListener( (e)-> validerModif() );
     
    	    boutonPane.add(bouton);
    	    this.getContentPane().add(boutonPane, BorderLayout.SOUTH);
     
      }
     
      private void validerModif() {
     
               // faire ce que tu veux avec les données de la table
               // par exemple :
               int rowCount = tableau.getRowCount();
     
     
               // fermer la fenêtre
               dispose(); // la classe interne a accès directe au méthode de la classe qui la contient (TableauMax)
      }
     
    }

    PS : je mettrais tous les composants (JSCrollPane et JButton) dans un JPanel(avec le BorderLayout sur ce panel), que je mettrais seul dans le contentPane de la fenêtre (ou à la place du contentpane), ça t'évitera des complications dans la gestion du layout plus tard si tu fais évoluer ta fenêtre.
    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
    Candidat au Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Décembre 2014
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    bonsoir,

    un grand merci à toi de prendre du temps pour m'aider.

    La partie swing m'est assez ardue. J'essaye d'y aller pas à pas.

    Donc, dans un premier temps, je reste sur la méthode d'avoir 2 classes distinctes, ça me permets d'avoir une meilleure vue de mon projet, et ca m'évite de m'embrouiller. Puis quand j'aurais bien compris le truc, je réintegrerai la classe du bouton dans la première, comme tu me le conseilles.


    Donc dans un premiers temps, j'ai modifié ma classe ValiderModif, pour y intégrer le JFrame de TableauMax :

    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
     
    public class ValiderModif extends AbstractAction {
     
    	private final TableauMax frame;
     
    	public ValiderModif(String texte, TableauMax frame){
    		super(texte);
    		this.frame=frame;
    	}
     
     
     
    	public void actionPerformed(ActionEvent e) { 
     
    			// récupération et travail des valeurs éventuellement modifiées de la JTable de la fenetre TableauMax
     
     
     
     
    			// fermeture de la fenetre TableauMax.
     
     
    			frame.dispose(); 
     
    	}
    }
    mais puisque dans ma méthode ValiderModif, je mets 2 arguments (String texte, TableauMax frame)
    je dois donc également déclarer 2 arguments lorsque je l'appelle dans TableauMax.
    et la, je bute.
    je bute, parce que je ne vois pas à quoi fait référence le frame, puisqu'il n'est déclaré nul part dans la classe TableauMax.

  4. #4
    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
    Le code initial qui te sert à créer le bouton, à partir de ton Action :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JButton bouton = new JButton(new ValiderModif("Valider les modifications"));
    est placé dans la constructeur de TableauMax, où l'instance de TableauMax elle-même, est désignée par... this. Donc, tu as juste à ajouter this dans la liste des paramètres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JButton bouton = new JButton(new ValiderModif("Valider les modifications", this));
    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.

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Décembre 2014
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    un grand merci à toi

  6. #6
    Candidat au Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Décembre 2014
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Je me permets de solliciter encore un peu d'aide.
    décidément swing me donne du fil a retordre


    Je voudrais que les cellules de mon tableau soient éditables (dans le traitement des données avec le bouton validerModif, j'utiliserais les cases modifiées)

    en me renseignant sur la chose, j'ai compris qu'il fallait réécrire la méthode isCellEditable de ma classe TableauMax
    j'ai donc rajouter dans ma classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    boolean isCellEditable(int rowIndex, int columnIndex) {  
            return true;  
        }
    ce qui devait rendre toute les cellules éditables.

    lorsque j'exécute le programme, je n'ai aucune erreur, mais les modifications que je fais dans mon tableau ne sont pas prises en compte.

    en cherchant d'avantage, j'ai cru comprendre qu'il fallait créer un TableModel et l'associer à mon tableau, pour que le isCellEditable soit utilisé.
    mais je n'arrive pas à associer un TableModel à mon tableau :/

  7. #7
    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
    C'est une question qui n'a rien à voir : à l'avenir, tiens toi à une question par discussion. Cette question ayant été posée très souvent, je vais y répondre exceptionnellement ici : en plus de isCellEditable(), il te faudra également implémenter setValueAt pour indiquer comment les colonnes de la jtable vont être stockée dans l'objet de données (l'inverse de getValueAt, en quelque sorte). Il te faudra également peut-être faire des éditeurs spécifiques en fonction des données.

    Regarde, à ce sujet, le tutoriel, ici, sur DVP.
    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.

Discussions similaires

  1. Afficher/Fermer une fenêtre avec le même bouton
    Par unic0 dans le forum Tkinter
    Réponses: 7
    Dernier message: 08/03/2015, 17h48
  2. Fermer une fenêtre avec un bouton
    Par labaf dans le forum Tkinter
    Réponses: 2
    Dernier message: 20/04/2013, 17h41
  3. Fermer une fenêtre avec un bouton
    Par Sylv3D dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 06/04/2010, 22h42
  4. Fermer une fenêtre avec flex builder
    Par pacopizz dans le forum Flash
    Réponses: 1
    Dernier message: 09/09/2008, 15h12
  5. Fermer une intercace avec un bouton
    Par harris_macken dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 25/03/2008, 06h48

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