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

NetBeans Java Discussion :

Comment utiliser un Form étendant un autre Form avec Matisse ?


Sujet :

NetBeans Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 8
    Points : 9
    Points
    9
    Par défaut Comment utiliser un Form étendant un autre Form avec Matisse ?
    Salut à tous,

    Je commence à désespérer...Bon courage à ceux qui vont lire ce message car c'est un peu compliqué.

    J'utilise NetBeans 5.5 RC1 mais l'erreur se produit également avec les versions 5.0 et 5.5 beta 2 (j'ai tout essayé !), voici mon problème :

    Je souhaite créer avec le designer une "classe mère" (étendant JPanel et contenant un simple JLabel) qui me servira de base pour créer d'autres JPanel, toujours avec le designer.

    Dans mon projet, je crée donc un nouveau "JPanel Form" que je nomme TitledPanel. Dans la vue design, j'ajoute simplement un JLabel (nom de variable = labTitre) en haut de mon JPanel, je laisse le layout en Free design (NetBeans génère donc du code avec un GroupLayout). Je voudrais que le texte du JLabel soit égal à un champ titre que je vais ajouter manuellement dans le source de ma classe. Dans la propriété text de mon JLabel, j'utilise le Select Mode "Form Connection" et je tape "getTitre()" dans le champ "User code".
    Ensuite, je modifie le source de ma classe pour ajouter le champ titre et ses accesseurs + quelques petites choses, ce qui donne :

    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
     package tests.gui.components;
     
    import java.awt.Container;
    import java.awt.FlowLayout;
    import javax.swing.JPanel;
     
    public class TitledPanel extends javax.swing.JPanel {
     
        protected String titre;
     
        protected Container innerPane = new JPanel(new FlowLayout());
     
        public TitledPanel() {
            this("[Sans titre]");
        }
     
        public TitledPanel(String titre) {
            super();
            this.titre = titre;
            initComponents();
        }    
     
     
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        // <editor-fold defaultstate="collapsed" desc=" Generated Code ">                          
        private void initComponents() {
            labTitre = new javax.swing.JLabel();
     
            labTitre.setText(getTitre());
     
            org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
            this.setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .addContainerGap()
                    .add(labTitre, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                    .addContainerGap())
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .addContainerGap()
                    .add(labTitre)
                    .addContainerGap(275, Short.MAX_VALUE))
            );
        }// </editor-fold>                        
     
        public String getTitre() {
            return this.titre;
        }
     
        public void setTitre(String titre) {
            this.titre = titre;
            this.labTitre.setText(titre);
        }
     
        public Container getInnerPane() {
            return this.innerPane;
        }
     
        public void setInnerPane(Container innerPane) {
            this.innerPane = innerPane;
        }
     
     
        // Variables declaration - do not modify                     
        private javax.swing.JLabel labTitre;
        // End of variables declaration                   
     
    }
    J'ai lu à cette adresse :

    http://wiki.netbeans.info/wiki/view/...ExtendingForms

    que la classe mère devait soit n'avoir aucun composant, soit avoir un container delegate défini. C'est que j'ai fait avec le champ innerPane et ses accesseurs.

    J'ai créé par la suite la classe TitledPanelBeanInfo comme indiqué à cette adresse :

    http://wiki.netbeans.info/wiki/view/...mContainerBean

    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
     package tests.gui.components;
     
    import java.beans.BeanDescriptor;
    import java.beans.SimpleBeanInfo;
     
    public class TitledPanelBeanInfo extends SimpleBeanInfo {
     
        public TitledPanelBeanInfo() {
            System.out.println("constructeur de TitledPanelBeanInfo");
        }
     
        public BeanDescriptor getBeanDescriptor() {
            BeanDescriptor desc = new BeanDescriptor(TitledPanel.class);
            desc.setValue("containerDelegate", "getInnerPane");
            return desc;
        }
     
    }
    Je compile le tout et je crée dans mon projet un nouveau "Bean Form" avec pour SuperClass ma classe mère TitledPanel.

    Le designer m'affiche bien un panel contenant un JLabel dont le texte est "[Sans titre]", je peux même changer via la propriété titre le texte du JLabel (je vois le texte changer sur le panel), mais dès que je clique sur le panel dans le designer :

    java.lang.NullPointerException
    at org.netbeans.modules.form.FormDesigner.pointFromHandleToComponentLayer(FormDesigner.java:529)
    at org.netbeans.modules.form.HandleLayer.convertPointToComponent(HandleLayer.java:1336)
    at org.netbeans.modules.form.HandleLayer.processMouseClickInLayoutSupport(HandleLayer.java:772)
    at org.netbeans.modules.form.HandleLayer.mousePressed(HandleLayer.java:1521)
    at java.awt.Component.processMouseEvent(Component.java:5485)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
    at java.awt.Component.processEvent(Component.java:5253)
    at java.awt.Container.processEvent(Container.java:1966)
    at java.awt.Component.dispatchEventImpl(Component.java:3955)
    at java.awt.Container.dispatchEventImpl(Container.java:2024)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3889)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
    at java.awt.Container.dispatchEventImpl(Container.java:2010)
    at java.awt.Window.dispatchEventImpl(Window.java:1778)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    [catch] at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
    Et je ne peux évidemment rien faire d'autre sur le panel (pas d'ajout de composant entre autres).

    Au passage et à priori, le constructeur de TitledPanelBeanInfo et la méthode getBeanDescriptor()) ne sont jamais appelés car pas de message dans la console.

    Est-ce que je me suis trompé quelque part ?

    Vous allez me dire que c'est un bug de NetBeans, j'avoue que je n'ai pas vraiment le courage, ni le temps de traduire ce message et de le soumettre à la communauté NetBeans.

    Quelqu'un aurait-il trouvé une autre façon de procéder pour contourner ce bug ?

    En d'autres termes, avez-vous réussi à utiliser un Form étendant un autre Form avec Matisse ?

    Et plus spécifiquement est-il possible d'hériter d'un Form étendant JPanel auquel on pourra ajouter des composants avec le designer ?

    Merci d'avance d'avoir tenu jusqu'ici,

    A+

    Laurent.

  2. #2
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Points : 70
    Points
    70
    Par défaut
    yep,

    je viens de poser le même type de message... aurais tu trouver une solution depuis le temps ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 8
    Points : 9
    Points
    9
    Par défaut Malheureusement non...
    pas pour l'instant.Si tu trouves quelque chose de ton côté, je suis preneur !

    Tu as essayé tout ce qui est dit à cette adresse ?

    http://wiki.netbeans.info/wiki/view/...ExtendingForms

    avec le container delegate et tout ?

    J'ai pas réessayé avec la 5.5, je te tiens au courant dès que j'ai le temps de faire ça.

  4. #4
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Points : 70
    Points
    70
    Par défaut
    Oui mais c'est vraiment pas clair...


    Une fois qu'on a fait la classe "TitledPanelBeanInfo", on en fait quoi ?

    Je continue à chercher ...

  5. #5
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Points : 70
    Points
    70
    Par défaut
    J'ai trouvé ça :

    http://wiki.netbeans.info/wiki/view/...mContainerBean

    Par contre je ne vois pas trop comment me servir de ma nouvelle classe "ClasseABeanInfo.java"...


    Mots clés : Bean Info, Bean Patterns, beanDescriptor

  6. #6
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Points : 70
    Points
    70

  7. #7
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Points : 70
    Points
    70
    Par défaut Ajout de composants dans 1 classeB heritant d'1 classeA contenant des composants
    Salut,

    Mon but est d'utiliser le code de ma classe CreerCommande.java (heritant de JPanel) pour faire une classe ModifierCommande.

    Note : Dans ma classe CreerCommande je possede une multitude de composants (JComboBox, JxTable etc ...)

    Pour se faire, je vais donc créer une classe ModifierCommande qui herite de CreerCommande.

    Seulement voila, mon soucis est que NetBeans ne me permet pas de rajouter des composants. Il me met un message de type "Warning Form Loaded With Errors".

    Ce site http://wiki.netbeans.info/wiki/view/...mContainerBean
    explique comment il faut faire.

    (Apparement il faudrait créer une classe de description du bean "mere" et modifier une méthode : getBeanDescriptor())

    Mais il y a quelque chose que je comprend pas la dedans, qu'est ce que je fais de ma classe de description "MyContainerBeanInfo" ?

    Merci de me rassurer sur le fait que c'est possible avec NetBeans et que je ne dois pas changer de langage

    Quelques liens utiles..

    http://www.netbeans.org/servlets/Rea...ss_fr&msgNo=57
    http://forum.java.sun.com/thread.jsp...183005#1183005
    http://forum.java.sun.com/thread.jsp...hreadID=211553
    http://www.developpez.net/forums/sho...d.php?t=218974

  8. #8
    Membre éprouvé
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Points : 936
    Points
    936
    Par défaut
    J'ai essayé hier mais avec la même erreur que lacasure avec un NPE dans le FormDesigner.
    Je pense que c'est un problème de controle de leur part mais qu'il manque qqs chose dans notre code.

    Je vais essayer autre chose ce soir

  9. #9
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Points : 70
    Points
    70
    Par défaut
    Mais toi tu as une erreur au moins...

    Qu'est ce que tu en as fais de la classe "MyContainerBeanInfo" ?

  10. #10
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Points : 70
    Points
    70
    Par défaut
    Encore un post...

    http://www.netbeans.org/servlets/Rea...bui&msgNo=6639

    Lui aussi a l'air de dire que c'est impossible, que la FAQ de NetBeans est fausse à ce sujet.

  11. #11
    Membre éprouvé
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Points : 936
    Points
    936
    Par défaut
    Ton BeanInfo t'en fait rien c'est le formdesigner qui va le lire tout seu et d'ailleurs ca marche.

    1. tu crées un jpanel en mettant des composants dedans.
    2. tu génères le BeanInfo en rajoutant la ligne du setvalue pour la containerDelegate.
    3. dans la source de ton panel, tu rajoute ta fonction getInnerPane() retournant un conteneur vide dont le layout est initialisé.
    4. tu crée un Beanform heritant de ton panel et si tu va voir dans le code, dans le initComponent, il fait bien reference à ton getInnerPane() pour récupérer un conteneur et normalement permettre de pouvoir y rajouter du contenu.
    => Exception NPE qui montre bien qu'il manque qs chose, soit dans notre code, soit un bug dans le formdesigner

    Je devais aller voir le code source hier mais j'ai manqué de temps.

    Sinon tout ce que je viens de dire est dans le sujet de lasacure et je serais pour continuer cette discution labas, le sujet étant tout de meme plus complet

  12. #12
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 117
    Points : 70
    Points
    70
    Par défaut
    lol je te remercie pour ta franchise.

    Sinon, j'ai bien capté que la Classe B prend en compte le Bean Info.
    Je voulais savoir comment.. Comme tu dis, ce doit être le form Designer qui le gere.

    J'ai testé avec Eclipse vite fait mais apparement ça ne marche pas non plus. Cela me conforte un peu sur le choix de NetBeans mais m'avance à rien donc je retourne chercher...

  13. #13
    Membre habitué

    Inscrit en
    Février 2007
    Messages
    250
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2007
    Messages : 250
    Points : 162
    Points
    162
    Par défaut
    J'ai un peu le meme problème.

    On veut créer une fenêtre contenant 3 boutons en bas (Ok Cancel Apply).
    On les place dans un container en south d'un gridbag. En center on laisse un JPanel vide. pour laisser l'utilisateur poser ce qu'il veut

    Mais comme tout doit être fait dans la partie bleu initComponent, l'utilisateur peut retirer les panels... et ça c'est pas cool.

    avec une dérivation on devrait pouvoir, mais là, je ne sais pas comment faire.... si vous avez des idées...

Discussions similaires

  1. Comment utiliser un bouton en simple onClick autre que submit
    Par Dendrite dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 17/11/2008, 16h49
  2. comment capter un evenement survenu sur une autre form?
    Par Jayceblaster dans le forum Windows Forms
    Réponses: 1
    Dernier message: 12/07/2007, 14h38
  3. Réponses: 1
    Dernier message: 06/05/2007, 10h43
  4. Réponses: 3
    Dernier message: 02/04/2007, 20h37
  5. [VB.NET] Utilisation d'une variable dans une autre form (!)
    Par neuropathie dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/12/2005, 13h09

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