Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2304 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [Swing] Une JList basique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Swing] Une JList basique

n°358522
Cherrytree
cn=?
Posté le 11-04-2003 à 10:15:12  profilanswer
 

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
mood
Publicité
Posté le 11-04-2003 à 10:15:12  profilanswer
 

n°358569
senternal
Posté le 11-04-2003 à 11:05:01  profilanswer
 

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 ?

n°358582
Cherrytree
cn=?
Posté le 11-04-2003 à 11:12:03  profilanswer
 

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
n°358732
bobuse
Posté le 11-04-2003 à 13:51:54  profilanswer
 

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
n°358748
Cherrytree
cn=?
Posté le 11-04-2003 à 14:02:29  profilanswer
 

bobuse a écrit :

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


Qu'appelles-tu template ?


---------------
Le site de ma maman
n°358890
bobuse
Posté le 11-04-2003 à 15:08:50  profilanswer
 

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
n°358972
Cherrytree
cn=?
Posté le 11-04-2003 à 15:49:29  profilanswer
 

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
n°360538
senternal
Posté le 14-04-2003 à 15:35:43  profilanswer
 

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
n°360557
Cherrytree
cn=?
Posté le 14-04-2003 à 15:48:14  profilanswer
 

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
n°360588
senternal
Posté le 14-04-2003 à 16:07:36  profilanswer
 

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

mood
Publicité
Posté le 14-04-2003 à 16:07:36  profilanswer
 

n°360612
Cherrytree
cn=?
Posté le 14-04-2003 à 16:21:20  profilanswer
 

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
n°366331
Cherrytree
cn=?
Posté le 18-04-2003 à 13:36:07  profilanswer
 

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
n°366581
Cherrytree
cn=?
Posté le 18-04-2003 à 15:53:05  profilanswer
 

:bounce:


---------------
Le site de ma maman
n°367579
Cherrytree
cn=?
Posté le 20-04-2003 à 19:37:27  profilanswer
 

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


---------------
Le site de ma maman
n°367688
Monsieur C​hat
Posté le 21-04-2003 à 13:50:00  profilanswer
 

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
n°367746
Cherrytree
cn=?
Posté le 21-04-2003 à 15:55:44  profilanswer
 

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
n°367891
nraynaud
lol
Posté le 21-04-2003 à 20:24:41  profilanswer
 

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.

n°367893
nraynaud
lol
Posté le 21-04-2003 à 20:30:00  profilanswer
 

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.

n°393646
senternal
Posté le 14-05-2003 à 15:54:24  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [Swing] Une JList basique

 

Sujets relatifs
[SWING] La taille de la fenetre ?[SWING] Comment imprimer une JApplet sous IE?
[JAVA IHM] Swing ou JSP?[ SWING ] définir un "theme" de couleur général!
[ JAVA ] Swing définir les proportions d'un JSplitPane en %JList contenant des JCheckBox : gniiiiaaaaaa
Livre sur Swing approfondiComment ajouter une zone graphique a une frame swing?
[Swing] Centrer un JLabel dans un JDialogGridBagLayout Swing, tout déconne quand je resize la fenetre
Plus de sujets relatifs à : [Swing] Une JList basique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR