[Swing] Une JList basique

Une JList basique [Swing] - Java - Programmation

Marsh Posté le 11-04-2003 à 10:15:12    

Dans un programme de compta que j'écris actuellement j'utilise très souvent ce qui devrait à mon sens être un composant : une JList incluse dans un JScrollPane, avec un DefaultListModel comme modèle, et des méthodes, d'ajout d'objets, de mise à jour de ces objets et de suppression. C'est hyper classique comme utilisation d'une JList, et c'est pour cela que je voulais en faire une classe. Seulement, je me heurte à des problèmes de design. En fait je doute que cela soit une bonne idée, car cela me force (me semble t'il) à intégrer tout MVC dans la même classe. Des idées ?


---------------
Le site de ma maman
Reply

Marsh Posté le 11-04-2003 à 10:15:12   

Reply

Marsh Posté le 11-04-2003 à 11:05:01    

Perso je mettrais en place :
 
- une classe MyList qui etend JList
- des classes implementant MouseListener et KeyListener pour ta classe MyList
- un ListCellRenderer pour te permettre de modifier a la volée le contenu widget de ta liste. MyCellRenderer qui pourrait etre un JLabel, un JTextField... ou tout autre classe etendant les widget de base. Ca fait quelque chose du style MyCellRenderer extends MyDateJTextField implements ListCellRenderer
 
Avec ca, tu es modulaire car ta liste peut-etre simple ou complexifiée autant de fois que tu veux, en y ajoutant un ch'tit nouveau ListCellRenderer.
 
Any question ??
 
 
 

Cherrytree a écrit :

Dans un programme de compta que j'écris actuellement j'utilise très souvent ce qui devrait à mon sens être un composant : une JList incluse dans un JScrollPane, avec un DefaultListModel comme modèle, et des méthodes, d'ajout d'objets, de mise à jour de ces objets et de suppression. C'est hyper classique comme utilisation d'une JList, et c'est pour cela que je voulais en faire une classe. Seulement, je me heurte à des problèmes de design. En fait je doute que cela soit une bonne idée, car cela me force (me semble t'il) à intégrer tout MVC dans la même classe. Des idées ?

Reply

Marsh Posté le 11-04-2003 à 11:12:03    

senternal a écrit :


Any question ??


Ouais, au niveau du modèle. Mais en fait, ton approche très découplée répond, je pense à mon interrogation concernant les méthodes add(), update() et replace() que mon composant doit proposer. Il me parait désormais clair que je dois étendre le DefaultListModel (ou créer un ListModel custom) et y injecter mes méthodes.


---------------
Le site de ma maman
Reply

Marsh Posté le 11-04-2003 à 13:51:54    

Je vois pas trop l'interet d'un composant, mais j'ai peut-etre pas tout compris ... Moi j'utilise un template et je trouve que ca suffit amplement ...
 
 
En parlant de templates, vous connaissez un site ou on recuperer/soumettre des templates ...


---------------
get amaroK plugin
Reply

Marsh Posté le 11-04-2003 à 14:02:29    

bobuse a écrit :

Moi j'utilise un template et je trouve que ca suffit amplement ...


Qu'appelles-tu template ?


---------------
Le site de ma maman
Reply

Marsh Posté le 11-04-2003 à 15:08:50    

Cherrytree a écrit :


Qu'appelles-tu template ?


Ben un squelette de classe.
Pour la JList un truc du genre  

Code :
  1. TemplatePanel extends JPanel inplements blabla ...


qui construit le scrollpane, ajoute le header, le cellRenderer, le modelMachinTruc, et des squelettes pour les deux derniers ...
 
enfin tous les trucs que tu te tapes a chaque fois quoi ...


---------------
get amaroK plugin
Reply

Marsh Posté le 11-04-2003 à 15:49:29    

bobuse a écrit :


Ben un squelette de classe.
Pour la JList un truc du genre  

Code :
  1. TemplatePanel extends JPanel inplements blabla ...


qui construit le scrollpane, ajoute le header, le cellRenderer, le modelMachinTruc, et des squelettes pour les deux derniers ...
 
enfin tous les trucs que tu te tapes a chaque fois quoi ...


Mais c'est contraire à l'idée qui sous-tend la réutilisabilité des objets !


---------------
Le site de ma maman
Reply

Marsh Posté le 14-04-2003 à 15:35:43    

Pour ce qui est du modele, tu peux aussi refaire une ou plusieurs classes de modele. Cependant, la plupart du temps, les simples methodes d'ajout et de suppression heritées du modele de base sont suffisantes. Par contre, si tu veux gerer une liste et a coté un objet representant cette liste en "temps reel" cela peut-etre utile de reecrire ton model)
 

Cherrytree a écrit :


Mais c'est contraire à l'idée qui sous-tend la réutilisabilité des objets !


 
Bah, ouais, ca s'appelle le one-shot, c'est pas beau et c'est pas reutilisable... Ca correspond aux personnes pour qui faire de l'objet c'est comme faire du procedural... En gros du moment que j'ai un seul gros objet avec plein de methode dedans, je fais de l'objet...
 
Y'a du boulot...


Message édité par senternal le 14-04-2003 à 15:39:40
Reply

Marsh Posté le 14-04-2003 à 15:48:14    

senternal a écrit :


Y'a du boulot...


 [:zebra33]  
 
Conception objet et patterns objet c'est quand même deux niveaux de maîtrise assez distinct, hein !
 
Bon, enfin pour en revenir au sujet, j'ai finalement choisi de recoder le modèle, pour deux raisons : d'abord parce qu'un Vector en guise de delegate, c'est trop lourd pour mes besoins. Une ArrayList et pouf c'est tout. Secondo, DefaultListModel est une classe méli mélo. Un mix de Collection, Vector et de ListModel... Il y a trois méthodes pour récupérer, trois pour ajouter, trois pour retirer... Voyez vous même l'API, c'est la fête.
 
Là où j'aurais du travail, en fait c'est sur la JList proprement dite. La vue est OK, très bien. Le problème c'est que le MVC utilisé dans Swing est un MVC custom, ou le controller est mixé avec la vue. C'est précisément le controlleur que je vais en partie refaire.


---------------
Le site de ma maman
Reply

Marsh Posté le 14-04-2003 à 16:07:36    

Euh effectivement y'a un trou beant entre design pattern et objet. Quant a savoir si Java est un langage objet...
 
Pour finir, je dirais que parfois c'est pas des masses utile de "refaire la roue"... Tout depend de tes besoins mais pour ce qui est du MVC et sa representation la plus stricte, je suis perplexe quant a son application sur Swing... Swing reste un element de Java que je considere a part et bien que la differenciation vue/controle soit presente, je suis quelque peu perplexe. C'est tellement imbriqué comme fonctionnement (y'a qu'a voir les listener...). Autant je suis d'accord pour appliquer des patterns dans des cas precis (archi repartie par ex ou ca s'applique tres bien), autant swing... Mais bon, ca reste un avis tres personnel, bossant depuis quelques mois sur Swing, j'ai du moi aussi me plier et me resigner a certain "concept".
 
Arf, vivement que je reparte sur de la conception moins bordelique que Swing...
 

Reply

Marsh Posté le 14-04-2003 à 16:07:36   

Reply

Marsh Posté le 14-04-2003 à 16:21:20    

En l'occurence : mon besoin est simple : une liste basique dans laquelle j'ajoute des éléments, j'en retire et j'en mets à jour. Le modèle propose cela mais ne me plait guère. En revanche, rien n'est fait concernant la vue : sélectionner automatiquement l'élément qui vient d'être ajouté, sélectionner l'élément d'index n - 1, lors de la suppression de l'élément n... Ce genre de choses que je ne veux coder qu'une fois, pour ensuite utiliser n objets.


---------------
Le site de ma maman
Reply

Marsh Posté le 18-04-2003 à 13:36:07    

Voilà où j'en suis... J'ai pas mal cherché. De partout en vérité. J'ai presque résolu mon problème mais le serpent se mord la queue.
 
Je crée un ListDataListener :
 

Code :
  1. import javax.swing.*;
  2. import javax.swing.event.*;
  3. public class CustomListDataListener implements ListDataListener {
  4.     private JList view;
  5.     public CustomListDataListener(JList view) {
  6.         this.view = view;
  7.     }
  8.     public void contentsChanged(ListDataEvent e) {
  9.     }
  10.     public void intervalAdded(ListDataEvent e) {
  11.         view.setSelectedIndex(e.getIndex0());
  12.     }
  13.     public void intervalRemoved(ListDataEvent e) {
  14.         int index = e.getIndex0();
  15.         int size = view.getModel().getSize();
  16.         if (size != 0) {
  17.             if (index == size) {
  18.                 --index;
  19.             }
  20.             view.setSelectedIndex(index);
  21.         }
  22.     }
  23. }


 
Ce listener permet de sélectionner un élément particulier de la liste (basé sur son index), en cas d'ajout ou de suppression dans celle-ci.
 
Le problème est que l'initialisation devient plus compliquée :
 

Code :
  1. JList view = new JList();
  2. DefaultListModel model = new DefaultListModel();
  3. model.addListDataListener(new CustomListDataListener(view));
  4. view.setModel(model);


 
Alors qu'avant, sans listener, j'avais :
 

Code :
  1. DefaultListModel model = new DefaultListModel();
  2. JList view = new JList(model);


 
Je n'aime pas cette interdépendance que je crée entre la vue et le modèle. Y a t'il une autre solution, plus élégante, qui découple mieux ?


---------------
Le site de ma maman
Reply

Marsh Posté le 18-04-2003 à 15:53:05    

:bounce:


---------------
Le site de ma maman
Reply

Marsh Posté le 20-04-2003 à 19:37:27    

Je me permets de upper, au cas où un monstre en Swing passe dans le coin.


---------------
Le site de ma maman
Reply

Marsh Posté le 21-04-2003 à 13:50:00    

Edit:
En fait ce que j'ai écrit ne marche pas.
 
A mon avis tu peux pas simplifier ce que t'as fait, a part peut etre faire

Code :
  1. DefaultListModel model = new DefaultListModel();
  2. JList view = new JList(model);
  3. model.addListDataListener(new CustomListDataListener(view));


 
tu gagnes une ligne


Message édité par Monsieur Chat le 21-04-2003 à 15:14:07
Reply

Marsh Posté le 21-04-2003 à 15:55:44    

Monsieur Chat a écrit :

Edit:
En fait ce que j'ai écrit ne marche pas.
 
A mon avis tu peux pas simplifier ce que t'as fait, a part peut etre faire

Code :
  1. DefaultListModel model = new DefaultListModel();
  2. JList view = new JList(model);
  3. model.addListDataListener(new CustomListDataListener(view));


 
tu gagnes une ligne


J'y avais bien pensé ! :D C'est plus question design que ça me pose un soucis. Mineur, mais un soucis quand même. Merci de t'être penché sur mon cas, en tous cas.


---------------
Le site de ma maman
Reply

Marsh Posté le 21-04-2003 à 20:24:41    

senternal a écrit :

C'est tellement imbriqué comme fonctionnement (y'a qu'a voir les listener...). Autant je suis d'accord pour appliquer des patterns dans des cas precis (archi repartie par ex ou ca s'applique tres bien), autant swing...  


Je crois que t'as pas tout compris au MVC et aux dépendances mises en jeu.

Reply

Marsh Posté le 21-04-2003 à 20:30:00    

Cherrytree a écrit :

cela me force (me semble t'il) à intégrer tout MVC dans la même classe. Des idées ?


Tu sors une interface pour ta liste réelle qui sera le modèle.
Tu mets tout le reste dans une classe qui sera une vue avec son contrôleur intégré (cas classique) et ses propres sous-modèles, sous-vues etc.

Reply

Marsh Posté le 14-05-2003 à 15:54:24    

nraynaud a écrit :


Je crois que t'as pas tout compris au MVC et aux dépendances mises en jeu.


 
Ah, les grandes phrases qui ne veulent rien dire, merci pour ton humour !! Tu connais au moins la signification de MVC ??
 
Pour finir, t'es pas mal pour proposer "ta" solution ("Tu sors une interface pour ta liste réelle qui sera le modèle" ), mais avant c'est bien aussi de lire tout le topic :sarcastic:  
 
Quoiqu'il en soit j'ai bien rigolé, je t'en remercie :D


Message édité par senternal le 14-05-2003 à 15:57:50
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed