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

 Java Discussion :

SwingUtilities et fonction interne


Sujet :

Java

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2016
    Messages : 4
    Points : 4
    Points
    4
    Par défaut SwingUtilities et fonction interne
    Bonjour, une vrai question de debutant mais je n'arrive pas a mettre de mot sur mon probleme pour trouver la solution :

    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
    import javax.swing.SwingUtilities;
     
     
    public class TestJframe {
     
    	public static void main(String[] args ){
     
    		SwingUtilities.invokeLater(new Runnable(){
    			public void run(){
    				Fenetre fenetre = new Fenetre();
    				fenetre.setVisible(true);
    			}
    		});
     
    	}
    En faite j'ai deux questions : Qu'est ce que SwingUtilities ? Je n'ai pas instancier cet objet comment ca se fait que puisse l'utiliser ?
    Et qu'est ce que c'est que cette syntaxe : SwingUtilities.invokeLater(new Runnable(){
    public void run(){

    Une fonction dans une fonction ? Quel est ce type d'argument ? Etudiant en 2eme année de Licence je ne l'avais vu auparavant

  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,

    SwingUtilities est une classe d'utilitaires pour Swing. La méthode invokeLater permet d'exécuter du code dans le thread de Swing/ Swing impose d'exécuter la plupart des méthodes de ses classes dans un thread dédié, appelé Event Dispatch Thread (EDT), afin d'éviter les conflits d'accès : l'affichage des composants, ainsi que le traitement des évènements s'effectuent dans ce thread : ainsi, si tu dois, par exemple, changer la liste des élements d'une JTable, et que tu le fais dans un autre thread que celui de Swing, tu risques de le faire quand Swing est en train de les afficher, et donc causer un dysfonctionnement. Comme un thread ne peux exécuter qu'une seule chose à la fois, tout faire sur le thread de Swing garanti qu'on ne modifie pas les éléments de la JTable pendant qu'on les affiche.

    Par ailleurs, la méthode invokeLater est une méthode statique : c'est une méthode qui n'est pas attachée à une instance de la classe et donc il n'est pas nécessaire de l'instancier pour pouvoir l'appeler. Il est d'ailleurs conseiller de ne pas invoquer une méthode statique sur une instance, mais toujours sur la classe, bien qu'on puisse techniquement le faire.

    Le paramètre de cette méthode est du type Runnable : il faut donc fournir une instance de Runnable à cette méthode.

    On pourrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class LancementFenetre implements Runnable {
        public void run(){
            Fenetre fenetre = new Fenetre();
    	fenetre.setVisible(true);
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class TestJframe {
     
    	public static void main(String[] args ){
     
    		SwingUtilities.invokeLater(new LancementFenetre());
     
    	}
    }
    La méthode invokeLater demande l'exécution du Runnable et rend la main immédiatement (le code s'exécutera lorsque le thread de Swing sera libre de le faire). Il existe une autre méthode invokeAndWait() qui permet d'exécuter aussi un Runnable par l'EDT mais en attendant qu'il soit exécuté (en bloquant le thread appelant).

    La syntaxe que tu montres utilise une instanciation de classe anonyme : au lieu d'écrire une classe spécifique (LancementFenetre dans mon exemple), on instancie directement la classe en indiquant son code et la classe à étendre ou l'interface à implémenter. Ceci évite de faire une classe qu'on utiliserait qu'une seule fois et qui ne servirait pas à un autre endroit.
    La syntaxe regroupe donc l'instanciation (par le new "nom de classe/interface" et la définition par le code des méthodes à implémenter ou à redéfinir le cas échéant.

    A noter que dans le cas de ton exemple, le invokeLater n'est pas indispensable : comme Swing n'a probablement pas encore été sollicité (puisque c'est un point d'entrée de programme), et que la fenêtre n'est pas encore créée ni affichée forcément , il n'y aucun risque de conflit.

    Enfin, avec l'introduction des expressions lambda en Java 8, il n'est plus nécessaire de créer la classe anonyme (parce que Runnable est une interface à une seule méthode (dite interface fonctionnelle)). On peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class TestJframe {
     
    	public static void main(String[] args ){
     
    		SwingUtilities.invokeLater( ()-> new Fenetre().setVisible(true) );
     
    	}
    }
    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
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 28
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2016
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Superbe reponse merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction interne et lettre "e"
    Par debmaths dans le forum Scheme
    Réponses: 5
    Dernier message: 25/03/2011, 16h04
  2. Fonction interne et let
    Par debmaths dans le forum Scheme
    Réponses: 3
    Dernier message: 26/02/2011, 20h53
  3. Utilisations de fonctions internes
    Par devalender dans le forum Firebird
    Réponses: 1
    Dernier message: 20/03/2009, 13h38
  4. Réponses: 4
    Dernier message: 01/03/2007, 13h19
  5. [AS2] Atteindre attribut d'une classe depuis une fonction interne a la classe
    Par Demco dans le forum ActionScript 1 & ActionScript 2
    Réponses: 6
    Dernier message: 18/04/2006, 21h03

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