Gosseyn
Messages : 286 Inscrit le 24/01/05
Ville : Grenoble
Non connecté
|
|
Posté le 22 septembre 2005 - 10 h 39 m 45 s |
|
|
Bonjour,
Je suis en train de creer une classe de saisie de texte. En parametre de cette classe, on passera un Widget/Control/Component de "type" texte, comme un label, un boutton, un champ editable.... En fait toute classe qui implemente la methode setText(). dans le but de rendre ma classe la plus générique possible, j'avais l'intention de prendre la classe mere de tous ces controls qui est JComponent (en Swing).
Malheureusement, JComponent ne definie pas la methode setText() et , certaines classes qui en derivent non plus.
donc pour implementer cela il reste comme methode de créer un constructeur+methode par classe admise (JButton, JLabel, JTextField, JPasswordField....) mais je me demande quand meme s'il n'y a pas une méthode + generique et + esthétique que cela. On pourrait aussi tester la classe passée en parametre dans une sorte de "switch" mais bon....
Je pensais qu'on pourrait faire mieux.
Merci d'avance pour suggestion.
|
|
| |
Message édité 1 fois, la dernière par Gosseyn le 18 octobre 2005 - 13 h 49. |
| |
"Si vous perdez, ne perdez pas la leçon."
Gosseyn
|
gege38
Modérateur
Chief of the (¯`·.__[T3aM.BouL3T©]__.·´¯) Potatoe Reloaded
Messages : 14 079 Inscrit le 05/02/03
Ville : Domène
Non connecté
|
|
Posté le 22 septembre 2005 - 14 h 21 m 47 s |
|
|
J'ai pas tout compris
Et créer une interface dont tous les fils héritent, et qui ne dispose que de la méthode setText() ?
Ou alors tu aimerais n'avoir qu'à écrire la méthode qu'une seule fois et de manière générique ?
Bref, j'ai rien compris 
Des exemples sont bienvenus
|
|
| |
" Nous plaisons plus souvent dans le commerce de la vie par nos défauts que par nos qualités. "
--La Rochefoucauld
|
Gosseyn
Messages : 286 Inscrit le 24/01/05
Ville : Grenoble
Non connecté
|
|
Posté le 22 septembre 2005 - 14 h 34 m 47 s |
|
|
c'est de ma faute j'aurais du etre + precis. Disons que je veux créer un pave numerique avec des boutons. Je veux rendre ce pavé reutilisable partout pour changer le label de JLabel, JButton, JTextField et bien d'autres. ce pavé est utilisé pour la saisie en lieu et place d'un hypothetique clavier. Lorsque je presse une touche cela rajoute le caractere de la touche au libellé du Widget. Je veux rendre ce pave numerique independant et reutilisable suivant les besoins donc il sera separé des widgets a la conception puis le tout est assemblé dans un JFrame.
J'ai fait une classe PaveNumerique, qui derive de JPanel, a qui l'on passe en parametre une reference au widget voulu que j'utilise pour appeler setText(). Comment faire pour que je n'ai pas un construteur par Widget mais un seul générique?
Ils derivent tous de JComponent qui n'a pas setText()...
Voala, c'est mieux?
Edit: et oui, il m'a fallu plusieurs essais...
|
|
| |
Message édité 2 fois, la dernière par Gosseyn le 22 septembre 2005 - 14 h 45. |
| |
"Si vous perdez, ne perdez pas la leçon."
Gosseyn
|
gege38
Modérateur
Chief of the (¯`·.__[T3aM.BouL3T©]__.·´¯) Potatoe Reloaded
Messages : 14 079 Inscrit le 05/02/03
Ville : Domène
Non connecté
|
|
Posté le 22 septembre 2005 - 14 h 51 m 13 s |
|
|
Donc si j'ai bien compris, tu fais passer en paramètre de la méthode de PaveNumerique un attribut JComponent ?
Et ensuite, cet argument, tu veux lui appliquer la méthode setText() c'est ca ?
EDIT : Si j'étais toi, pour éviter un switch, je ferais passer un deuxième argument, qui est le résultat de <NomWidget>.getClass()...
Et ensuite, poum, un coup de cast avec le 2eme argument et ca devrait marcher non ?
EDIT2 : Tiens, je suis curieux, je file tester ca
|
|
| |
Message édité 2 fois, la dernière par gege38 le 22 septembre 2005 - 14 h 57. |
| |
" Nous plaisons plus souvent dans le commerce de la vie par nos défauts que par nos qualités. "
--La Rochefoucauld
|
gege38
Modérateur
Chief of the (¯`·.__[T3aM.BouL3T©]__.·´¯) Potatoe Reloaded
Messages : 14 079 Inscrit le 05/02/03
Ville : Domène
Non connecté
|
|
Posté le 22 septembre 2005 - 15 h 10 m 40 s |
|
|
Bon, ben ca marche pô
Je file tester un deuxième truc marrant : utiliser de l'héritage
|
|
| |
" Nous plaisons plus souvent dans le commerce de la vie par nos défauts que par nos qualités. "
--La Rochefoucauld
|
Gosseyn
Messages : 286 Inscrit le 24/01/05
Ville : Grenoble
Non connecté
|
|
Posté le 22 septembre 2005 - 15 h 17 m 02 s |
|
|
Le 22 septembre 2005 - 14 h 51, gege38 a écrit :
Donc si j'ai bien compris, tu fais passer en paramètre de la méthode de PaveNumerique un attribut JComponent ?
Et ensuite, cet argument, tu veux lui appliquer la méthode setText() c'est ca ?
|
Sauf que la methode setText, n'existe pas dans JComponent.alors le compilateur me jete lorsque je l'appelle a partir d'un argument de cette classe.
EDIT : Si j'étais toi, pour éviter un switch, je ferais passer un deuxième argument, qui est le résultat de <NomWidget>.getClass()...
|
Tu as ete + rapide que moi pour tester
|
|
| |
"Si vous perdez, ne perdez pas la leçon."
Gosseyn
|
gege38
Modérateur
Chief of the (¯`·.__[T3aM.BouL3T©]__.·´¯) Potatoe Reloaded
Messages : 14 079 Inscrit le 05/02/03
Ville : Domène
Non connecté
|
|
Posté le 22 septembre 2005 - 15 h 41 m 51 s |
|
|
Le 22 septembre 2005 - 15 h 17, Gosseyn a écrit :
Le 22 septembre 2005 - 14 h 51, gege38 a écrit :
Donc si j'ai bien compris, tu fais passer en paramètre de la méthode de PaveNumerique un attribut JComponent ?
Et ensuite, cet argument, tu veux lui appliquer la méthode setText() c'est ca ?
|
Sauf que la methode setText, n'existe pas dans JComponent.alors le compilateur me jete lorsque je l'appelle a partir d'un argument de cette classe.
|
Voui voui, j'avais bien compris le problème...
Bon, j'ai joué un peu avec l'héritage, les interfaces etc, et mon résultat n'est pas très probant...
Pour l'instant, la meilleure solution est la pire, à savoir faire un test instanceof avant le cast approprié...
Tout aurait été différent si je disposais de l'héritage multiple (il aurait suffi de créer une sous-classe héritant de toutes tes classes de widget)
Bon dieu, ca fait 3 ans que Sun nous le promet
EDIT : Et sinon, tiens, je viens de penser à la généricité Java 5... Dommage, je n'ai pas trop eu le temps d'y jeter un oeil...
Qqs liens pour creuser :
http://lroux.developpez.com/article/java/tiger/?page=page_5#Lgenerics
|
|
| |
Message édité 1 fois, la dernière par gege38 le 22 septembre 2005 - 15 h 45. |
| |
" Nous plaisons plus souvent dans le commerce de la vie par nos défauts que par nos qualités. "
--La Rochefoucauld
|
Gosseyn
Messages : 286 Inscrit le 24/01/05
Ville : Grenoble
Non connecté
|
|
Posté le 22 septembre 2005 - 16 h 17 m 00 s |
|
|
Tout aurait été différent si je disposais de l'héritage multiple (il aurait suffi de créer une sous-classe héritant de toutes tes classes de widget) 
|
Je trouve que finalement on s'en sort pas mal sans. Je n'ai pas bcp pratiqué l'heritage multiple en C++ mais les qqs essais que j'i fait ne m'ont pas convaincu. Cela apporte pas mal de complexité surtout lors de la maintenance du code.
EDIT : Et sinon, tiens, je viens de penser à la généricité Java 5... Dommage, je n'ai pas trop eu le temps d'y jeter un oeil...
|
J'ai jete un oeil cela a l'air prometteur en effet.
apres reflexion, je pense que je vais reduire le nombre des widgets accpeté à la classe JTextField et ses derivées et voir plus tard pour le reste. cela sera moins generique que prevu au depart mais cela couvrira 95% de mes cas.
Dommage, je croyais qu'il y avait une solution à laquelle je n'avais pas pensé.
Merci de pour ton aide et tes remarques.
|
|
| |
Message édité 1 fois, la dernière par Gosseyn le 22 septembre 2005 - 16 h 18. |
| |
"Si vous perdez, ne perdez pas la leçon."
Gosseyn
|
sectos
Darkness is death's ignorance and the devil's time
Messages : 2 493 Inscrit le 31/01/03
Ville : Lyon
Non connecté
|
|
Posté le 22 septembre 2005 - 18 h 48 m 30 s |
|
|
si tu veux un truc qui passe partout
Method m = tonCompo.getClass().getMethod("getText", new Class[]{String.class})
m.invoke(tonCompo, new String[]{"super text"});
|
|
| |
|
kha
Google is your best friend
Messages : 1 235 Inscrit le 01/03/02
Ville : Montreal
Non connecté
|
|
Posté le 23 septembre 2005 - 02 h 38 m 46 s |
|
|
pour avoir de la genericite, c est la methode de sectos qui serait la plus adaptee.
Si tu ne sait pas trop comment la reflexion fonctionne, tu peux utiliser beanutils (et je te le conseille car c est une librairie assez puissante pour setter et getter des proprietes de facon generique)
Les composants swings se sont des beans.
Tu devrait, si tu as a setter des proprietes, utiliser beanutils de jakarta : http://jakarta.apache.org/commons/beanutils/index.html
Si tu veux un exemple d utilisation, regarde le post Java a cote, ou alors regarde le projet associe :
http://khapp.free.fr/pub/tmp/Ticket.zip
sinon regarde le code suivant :
1. public TicketController() throws IllegalAccessException, IOException, InvocationTargetException
2. {
3. Log.debug("new TicketController");
4.
5. // Load properties
6. final Properties prop = new Properties();
7. prop.load(ClassUtils.getRessource("/ticket.properties").openStream());
8.
9. // load DAO and set settings to it
10. this.dao = (ITicketDAO) ClassUtils.createInstance(prop.getProperty(PROP_DAO));
11.
12. BeanUtils.setProperty(this.dao, "fileUrl", prop.getProperty(PROP_FILE));
13. BeanUtils.setProperty(this.dao, "dbDriver", prop.getProperty(PROP_DB_DRV));
14. BeanUtils.setProperty(this.dao, "dbUrl", prop.getProperty(PROP_DB_URL));
15. BeanUtils.setProperty(this.dao, "dbLogin", prop.getProperty(PROP_DB_LOGIN));
16. BeanUtils.setProperty(this.dao, "dbPassword", prop.getProperty(PROP_DB_PASS));
17.
En gros, this.dao est l instance d une classe qui contient des methodes : setDbPassword, setDbLogin, ...
Les valeurs de ces proprietes sont recuperees dans un fichier puis settees dans le bean.
|
|
| |
|
degourth
YO | DeGourth
Messages : 685 Inscrit le 01/04/03
Ville : Gex
Non connecté
|
|
Posté le 23 septembre 2005 - 11 h 17 m 32 s |
|
|
+1 pour sectos
tu cherche un comportement commun a plusieur classe (setText())
ce comportement n'etant malheureusement pas specifié par une interface il te reste deux solution :
la solution statique (et c'est parti pour un switch, des instanceof et du cast sur un liste de classe predefinies ...)
la solution dynamique (decrite succintement par sectos) en utilisant l introspection (est ce qu l objet de cette classe porte la methode setText(), si oui on l apelle ...)
bein entendu la deuxieme est la plus propre et la plus evolutive ...
++ Deg.
|
|
| |
Do not meddle in the affairs of geeks, for they are subtle and quick to anger.
|
Gosseyn
Messages : 286 Inscrit le 24/01/05
Ville : Grenoble
Non connecté
|
|
Posté le 26 septembre 2005 - 09 h 59 m 43 s |
|
|
Merci pour ces remarques sur la reflexion et les beanutils. Je ne vais pas les utiliser presentement car je ne maitrise pas tout mais je suis en train d'approfondir le sujet et c'est assez interessant pour que cela me serve dans l'avenir.
|
|
| |
"Si vous perdez, ne perdez pas la leçon."
Gosseyn
|