France Hardware : Forums de discussion
Retrouvez les prix près de chez vous :  
Index du forum | Liste des membres | Liste des groupes | Inscription | F-A-Q | Recherche
Pseudo :    Password :     
22 342 membres enregistrés - 1 872 905 posts - 95 150 topics
Index des forums FH  | Index des forums DegroupNews
      Programmation
           Langages Web
                [RESOLU] [JAVA] Problem de conception.
36 connectés(record : 207 le 05 juin 2007 - 05 h 23)

Vous devez vous connecter pour répondre au topic.
[RESOLU] [JAVA] Problem de conception.

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 :chepa:

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 :D
Des exemples sont bienvenus :D



" 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 :D


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ô :D

Je file tester un deuxième truc marrant : utiliser de l'héritage :D



" 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 :roll:



"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 :nrv:

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 :

    Code java    
 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


Page genérée en 1.1590 secondes par RahForum 2.0 | Gzip off |  Stats |  Metaforums |  RSS
© 2004 Cerbere Systems.
Prix Matériel Informatique | Informatique Lyon | Informatique Grenoble | Informatique Annecy | Informatique Marseille | Informatique Bordeaux | Forum Informatique
ADSL |Actualité ADSL | e-commerce | Commande Au Volant
Creative Commons
Message Boards and Forums Directory