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.