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 :

[SWING] Création de son propre composant (JLabel + JComponent)


Sujet :

AWT/Swing Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut [SWING] Création de son propre composant (JLabel + JComponent)
    Bonjour,
    Je souhaite créer mon propre composant : un JLabel + un JComboBox (ou JTextField).
    Pour cela, je déclare une classe Composant dérivant de JComponent. Voici mon code :
    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
     
    public class Composant extends JComponent {
     
        // Un label qui affiche l'information à entrer
        private JLabel label = null;
     
        // Un composant qui permet la saisie de l'information
        private JComponent composant = null;
     
        // Un panel qui gère le label et le composant
        private JPanel panelPrincipal = null;
     
         public Composant(String texte, String typeComposant) {
             // Si le texte et le composant ne sont pas nulls
             if ((texte != null) && (composant != null)) {
     
                 // On instancie le label avec le texte
                 label = new JLabel(texte + " : ");
     
                 // Si on demande une liste déroulante
                 if (typeComposant.equals("JComboBox")) {
                     // On instancie uns liste déroulante
                     composant = new JComboBox();
     
                 // Si on demande un JTextField
                 } else if (typeComposant.equals("JTextField")) {
                     // On instancie un champ texte
                     composant = new JTextField();
                 }
     
                 // On instancie le panelPrincipal
                 panelPrincipal = new JPanel(new FlowLayout());
     
                 // On ajoute le label et le composant au panelPrincipal
                 panelPrincipal.add(label);
                 panelPrincipal.add(composant);
     
                 // On ajoute le panelPrincipal au composant
                 this.add(panelPrincipal);
             }
         }
    }
    Ensuite, j'ai créer une fenêtre avec un panel géré par un BoxLayout, voici un bout de mon autre classe :
    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
     
    // On instancie les listes déroulantes
    private Composant serveur = new Composant("Serveur", "JComboBox");
    private Composant client = new Composant("Type de client", "JComboBox");
    private Composant typeDocument = new Composant("Type de document", "JComboBox");
     
    // On instancie le champ texte
    private Composant id = new Composant("ID du client", "JTextField");
     
    // On instancie le panel des listes déroulantes et du champ texte
    panelInformations = new JPanel();
     
    // On définit le layout pour le panel
    panelInformations.setLayout(new BoxLayout(panelInformations, BoxLayout.Y_AXIS));
     
    // On ajoute les listes déroulantes et le champ texte au panelInformations
    serveur.setAlignmentX(Component.LEFT_ALIGNMENT);
    panelInformations.add(serveur);
    typeDocument.setAlignmentX(Component.LEFT_ALIGNMENT);
    panelInformations.add(typeDocument);
    client.setAlignmentX(Component.LEFT_ALIGNMENT);
    panelInformations.add(client);
    id.setAlignmentX(Component.LEFT_ALIGNMENT);
    panelInformations.add(id);
     
    ...
     
    // On instancie le panel principal
    panelPrincipal = new JPanel(new BorderLayout());
     
    // On ajoute le panelInformations au panelPrincipal
    panelPrincipal.add("Center", panelInformations);
     
    // On affiche les boutons dans la fenêtre (this)
    this.getContentPane().add(panelPrincipal);
    Mon problème est qu'aucun "Composant" ne s'affiche dans la fenêtre et je ne vois vraiment pas où est mon erreur. Alors si vous avez des idées, merci !

  2. #2
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Moi non plus, je ne vois pas d'erreur sur ce que tu nous montres, mais cela ne prouve rien.

    Je te conseille de faire un JFrame de test avec juste un de tes Composants dedans, pour voir.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Bonjour, j'ai essayé de n'afficher qu'un "Composant" dans ma fenêtre mais rien ne s'affiche.
    Je vous remet le code de mon composant puisqu'il y avait une faute :
    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
     
    public class Composant extends JComponent {
     
        /* Attributs */
     
        // Un label qui affiche l'information à entrer
        private JLabel label = null;
     
        // Un composant qui permet la saisie de l'information
        private JComponent composant = null;
     
        // Un panel qui gère le label et le composant
        private JPanel panelPrincipal = null;
     
        public Composant(String texte, String typeComposant) 
        {
            // Si le texte et le composant ne sont pas nulls
            if ((texte != null) && (typeComposant != null)) {
     
                // On instancie le label avec le texte
                label = new JLabel(texte + " : ");
     
                // Si on demande une liste déroulante
                if (typeComposant.equals("JComboBox")) {
                    // On instancie uns liste déroulante
                    composant = new JComboBox();
     
                // Si on demande un JTextField
                } else if (typeComposant.equals("JTextField")) {
                    // On instancie un champ texte
                    composant = new JTextField();
                }
     
                // On instancie le panelPrincipal
                panelPrincipal = new JPanel(new FlowLayout());
     
                // On ajoute le label et le composant au panelPrincipal
                panelPrincipal.add(label);
                panelPrincipal.add(composant);
     
                // On ajoute le panelPrincipal au composant
                this.add(panelPrincipal);
            }
        }
    }
    Ca ne marche toujours pas.

    Idée :
    Quand on crée un JComponent, ne faut-il pas lui ajouter une taille et le dessiner avec la méthode paintComponent() ?

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Bon ba, ayant une contrainte de temps pour mon application, je suis parti sur autre chose qui marche.
    Cependant, si vous avez une réponse à mon problème, cela m'intéresse.

  5. #5
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Hello,

    Je ne coderais pas ta classe comme ça.
    Ce qu'il faut penser quand tu codes un composant c'est ce qu'il est.
    En l'occurence ton "Composant" c'est un JPanel contenant un label et un composant. Donc on va directement faire hériter de JPanel et virer panelPrincipal.

    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
    public class Composant extends JPanel {
     
        private JLabel label = null;
        private JComponent composant = null;
     
        public Composant(String texte, String typeComposant) 
        {
           // envoyer des exceptions n'est pas du luxe
           if (texte == null || typeComposant == null) {
                  throw new NullPointerException("Les paramètres ne peuvent pas être nuls");
           }
            // Si le texte et le composant ne sont pas nulls
    // inutile maintenant        if ((texte != null) && (typeComposant != null)) {
     
                // On instancie le label avec le texte
                label = new JLabel(texte + " : ");
     
                // Si on demande une liste déroulante
                if (typeComposant.equals("JComboBox")) {
                    // On instancie uns liste déroulante
                    composant = new JComboBox();
     
                // Si on demande un JTextField
                } else if (typeComposant.equals("JTextField")) {
                    // On instancie un champ texte
                    composant = new JTextField();
                }
     
                setLayout(new FlowLayout());
                add(label);
                add(composant);
    //         }
        }
    }
    Sinon je me permet des petites remarques complémentaires.
    Problème 1 de cette approche, tu ne pourras pas aligner les composant correctement (très moche).
    Problème 2, envoyer une String pour créer le composant, une erreur de frappe et c'est foutu (il faudrait donner directement le composant : new Composant("coucou", new JComboBox()) ).

    Pourquoi ça ne pouvait pas fonctionner en héritant de JComponent ? Un JComponent ne "sait pas" se dessiner tout seul, ajouter des composants ne les fera pas s'afficher par magie. Si tu hérites de JComponent tu vas devoir coder une méthode paintComponent(), inutile dans ton cas.
    Un JPanel ça va, car il gère la notion de layout.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Points : 279
    Points
    279
    Par défaut
    Merci pour ta réponse natha.
    Je viens de tester à l'instant et ça marche parfaitement.
    J'ai pris également en compte tes remarques

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

Discussions similaires

  1. [Kettle PDI] Création de son propre plugin
    Par arno974 dans le forum kettle/PDI
    Réponses: 2
    Dernier message: 20/05/2010, 12h28
  2. Réponses: 1
    Dernier message: 12/07/2009, 10h51
  3. Création de son propre repository
    Par Cooly dans le forum Maven
    Réponses: 1
    Dernier message: 13/03/2007, 19h28
  4. Création de son propre message dans un formulaire
    Par androme dans le forum C++Builder
    Réponses: 17
    Dernier message: 07/02/2005, 00h13
  5. [C#] Ajouter son propre composant dans Design de VS.Net
    Par yannick_sch dans le forum Windows Forms
    Réponses: 2
    Dernier message: 26/08/2004, 12h14

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