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:
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:
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 :
Citation:
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.
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