[Java/Interface graph]Choisir une colonne à partir d'un menu

Sting_6322
[Java/Interface graph]Choisir une colonne à partir d'un menu

Bonjour

Pour choisir la colonne souhaitée à partir d'un menu, j'ai fait ceci mais ça ne fonctionne pas.
J'ai fait les écouteurs "à la main" mais dans le cas ou on a 1000 choix par exemple, ça ne pourra pas être possible de faire comme ça.
pouvez-vous m'indiquer comment m'y prendre pour que ça fonctionne et pour ne pas faire les écouteurs un à un

Merci

fredericmazue

Quote:
J'ai fait les écouteurs "à la main" mais dans le cas ou on a 1000 choix par exemple, ça ne pourra pas être possible de faire comme ça.

Certes..

Quote:

J'ai fait les écouteurs "à la main" mais dans le cas ou on a 1000 choix par exemple, ça ne pourra pas être possible de faire comme ça.
pouvez-vous m'indiquer comment m'y prendre pour que ça fonctionne et pour ne pas faire les écouteurs un à un

Je me permets une question naïve: Pourquoi ne pas utliser un IDE tel que Netbeans qui ferait tout le travail pour toi automatiquement ?

Sting_6322

fredericmazue wrote:
Quote:
J'ai fait les écouteurs "à la main" mais dans le cas ou on a 1000 choix par exemple, ça ne pourra pas être possible de faire comme ça.

Certes..

Quote:

J'ai fait les écouteurs "à la main" mais dans le cas ou on a 1000 choix par exemple, ça ne pourra pas être possible de faire comme ça.
pouvez-vous m'indiquer comment m'y prendre pour que ça fonctionne et pour ne pas faire les écouteurs un à un

Je me permets une question naïve: Pourquoi ne pas utliser un IDE tel que Netbeans qui ferait tout le travail pour toi automatiquement ?


Je ne m'y connais pas.
Concernant mes soucis, pourrais-tu m'indiquer comment régler cela ?

Merci

fredericmazue

Quote:

Je ne m'y connais pas.

Ben justement, il n'y a rien à y connaître. Tu vas à http://www.netbeans.org Tu télécharges un Netbeans et avec tu construis ton interface à coup de souris et tu n'as plus qu'à insérer ton code dans le corps des méthodes générées automariquement et appelées automatiquement par les écouteurs.

Quote:
Concernant mes soucis, pourrais-tu m'indiquer comment régler cela ?

Ben je pensais l'avoir fait. Pour ne pas avoir à tout écrire à la main, il faut faire appel à un outil qui automatise le travail. Enfin je pense.

Sting_6322

fredericmazue wrote:
Quote:

Quote:
Concernant mes soucis, pourrais-tu m'indiquer comment régler cela ?

Ben je pensais l'avoir fait. Pour ne pas avoir à tout écrire à la main, il faut faire appel à un outil qui automatise le travail. Enfin je pense.


Le souci c'est pas vraiment d'écrire les écouteurs à la main dans la classe que j'ai mis mais plutot de faire fonctionner le programme.
Je ne sais pas très bien comment m'y prendre pour sélectionner la colonne de la JTable que je veux.
fredericmazue

Quote:
La classe est compilable. Pourrais-tu la tester

Non. Je contribue volontiers à ce forum mais il faut une limite ;)

Quote:

j'explique un peu ce que j'ai fait.
J'ai crée un menu "choix" dans lequel, j'ai la possibilité de choisir de voir une colonne précise "choix d'une colonne" ou de voir toutes les colonnes "toutes les colonnes".
Ce que j'aimerais, c'est que lorsque je clique sur un des choix, j'ai ce qu'il faut

Je vois.
Je n'avais pas compris la question comme ça au début.

Quote:
m'indiquer comment la modifier ?

Simple. Je laisserais tomber le tableau comme structure de données pour les colonnes. Je définirais une classe colonne contenant un titre et son contenu. Et j'utiliserais deux ArrayList dans le modèle de données de la table. Dans la première je mettrais toutes les colonnes de la table. La deuxième serait définie à la volée selon les choix de menu et contiendrait donc tout ou partie de la première. Ou simplement le nom des colonnes à afficher. Et mes méthodes getValuteAt et compagnie ne parcourait que la deuxième ArrayList. Eventuellement en se référant, mais dans un second temps à la première si par exemple la deuxième ne contient que des noms de colonnes. Suis-je clair ?

Sting_6322

En faite, ça ne m'est pas possible de changer Object [][] datas par autre chose car dans d'autres classes que j'utilises, c'est cette forme que j'utilises et si je modifie ça il faudra aussi que je modifie des méthodes, etc ...
Tout marche nickel à part cette classe de Test et je ne voudrais pas me retrouver avec plein d'erreurs
Si tu as une idée avec la manière dont j'ai écrit ma classe, je suis preneur

Merci

Sting_6322

J'ai viré tous les actionListener car ça ne fonctionnait pas.

fredericmazue

Quote:

Si je modifie ça il faudra aussi que je modifie des méthodes, etc ...

Oui en effet ...

Sans vouloir trop philosopher, voilà ton problème. On nous raconte que les composants Swing sont MCV, soit Model (données) View (représentation graphique) et Control (de l'utilisateur) sont découplés.
Tu te heurtes au fait que ça n'est pas vrai, la vérité est qu'on pourrait dire que c'est du M-VC, du modèle d'un côté et de l'autre côte Vue et contrôle sont couplés.
Ce que tu veux faire est plus proche du MVC que du M-VC et c'est la cause de tes difficultés. Et la suggestion que je t'ai faite se base sur l'idée d'un meilleur MVC. Donc tout autre idée avec la même intention peut convenir. Mais puisqu'il s'agit de découpler, il est évident que cela implique des modifications sur le code.

Maintenant pour ton code et ton cas particulier, je vois une solution rapide. Tu gardes ton tableau columnsVisible mais tu le redimensionnes dynamiquement à la volée et tu le remplis de même. C'est possible de faire un mécanisme de tableau dimensionnés dynamiquement à partir du mécanisme de réflexion de Java. Sinon, peut être plus simplement (ça devrait suffire si je comprends bien ton ocde), tu re-crées et remplis le tableau en fonction des besoins, c'est à dire en fonction des choix de l'utilisateur. Comme ça, si j'ai bien compris, les modifs ne vont pas au délà de la présente classe.

Mais bon, j'ai quand même du mal à suivre pourquoi sous prétexte que ton constructeur reçoit Object [][] datas, tu ne pourrais pas, à partir de ça, construire et utiliser des ArrayList en interne.

Sting_6322

Je me suis inspiré d'un code

fredericmazue

Il te dit que quand tu as *toi même* géré le nouveau columnsVisible, tu appelles la méthodes fireMachin pour que ta table se redessine.

Sting_6322

Le code fonctionne correctement dans le cas non dynamique mais dans la cas dynamique je n'y arrive pas

fredericmazue

Quote:

Quelqu'un pourrait-il m'indiquer cela s'il vous plait

Sincèrement je crois que c'est fait. Tu dois avoir besoin de respirer un bon coup et de prendre un peu de recul. Tu y verras sans doute plus clair après.

Quote:
Donc dans le cas dynamique, il faut donc que j'écrives une méthode qui prend en parametre un entier qui est le numero de la colonne que l'on veut voir et met les autres colonnes non visibles

D'une façon ou d'une autre, c'est bien ce qu'il faut faire.

Quote:

ensuite pour l'écoute sur un item, j'ai fait ça pour tester :
item.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
myTable.choice(2);
}
});

Mais ça ne marche toujours pas.. Je ne sais vraiment plus comment faire.

Là je ne sais pas ce que tu appelles "tester".
Si tu veux *voir à l'écran* le résultat des opérations, il faut que la table se redessine et pour cela tu dois *invoquer toi même* la méthode fireTableDataChanged pour rafraîchir l'affichage. Ca aussi ça a été dit.
Moyennant quoi si ton tableau columnVisibles, tes méthodes getColumnName, getValueAt et compagnie sont corrects, ça marchera, pour sûr.

Sting_6322

J'ai testé avec l'item "toutes les colonnes" qui dans mon exemple ne devrait faire apparaitre uniquement la colonne 2.

fredericmazue

Quote:
 item.addActionListener(new ActionListener(){
myTable.choice(2);
});

J'ai testé avec l'item "toutes les colonnes" qui dans mon exemple ne devrait faire apparaitre uniquement la colonne 2.
J'obtiens ces erreurs :
Code:
MyTable.java:127: expected
myTable.choice(2);
^
MyTable.java:127: illegal start of type
myTable.choice(2);
^
2 errors

Je ne comprends pas ce que ça signifie.

Houlà... Le compilateur est mécontent pour une évidente raison. Tu ne crois pas qu'une interface ActionListener ça préfère une méthode actionPerformed :?: :!:

il me semble que

item.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent ae) {
       myTable.choice(2); 
      }
       }); 

sera plus agréable au compilateur :)

Quote:
De plus, je ne peux pas appliquer les actions listeners aux listeItems car ce sont des Vector.
Code:
listeItems.addActionListener(new ActionListener(){//...});

ne fonctionne pas.
Je voudrais aussi savoir comment faire pour écouter des clics sur des JList car c'est elle qui contient les listeItem

Hum. Si tu écoutes les clicks sur ta JList, getSelectedValue doit te tirer d'affaire pour avoir la chaîne concernée.

Pardonne moi, je ne veux surtout pas te peiner en disant ça, mais il me semble que soit tu as besoin de repos pour y voir plus clair ensuite, soit tu as besoin d'acquérir quelques bases en programmation Swing pour pouvoir arriver à tes fins.

Sting_6322

Edit : en faite, j'avais j'initialisait 2 fois JList d'ou les problemes :lol:

fredericmazue

Quote:

local variable liste is accessed from within inner class

En effet, et cette classe intérieure (innner) c'est ta classe anonyme new ListSelectionListener // etc...

Quote:

J'ai donc mis la JList final :

Donc ? Et pourquoi *donc* ?

Quote:

MyTable.java:115: cannot assign a value to final variable liste
liste = new JList(listeItems);
^
1 error

Evidemment....

Quote:

Comment il faut que je modifies pour pouvoir utiliser JList list correctement ?

Tu as vu ton code ?

   final JList liste = new JList();
   //...
   liste = new JList(listeItems);

Pourquoi pas un seul

final JList liste = new JList(listeItems);

:?: :?:
Et puis sinon, si tu ne veux pas déclarer liste final, il suffit que la méthode de la classe anonyme appelle une méthode (à écrire) de ta classe MyTable pour sortir de la portée et avoir le droit d'accéder à liste.

Toutes choses très simples et basiques en somme.
Pardonne moi , mais dis ? Tu as beaucoup d'expérience en Java ? Parce qu'il me semble qu'il te manque quand même quelques fondamentaux que tu devrais acquérir avant de te lancer dans une application. Sinon tu risques de t'arracher les cheveux.

Sting_6322

fredericmazue wrote:

Toutes choses très simples et basiques en somme.
Pardonne moi , mais dis ? Tu as beaucoup d'expérience en Java ? Parce qu'il me semble qu'il te manque quand même quelques fondamentaux que tu devrais acquérir avant de te lancer dans une application. Sinon tu risques de t'arracher les cheveux.

En effet, ça ne fait que quelques mois que je fais du Java/Interface graphique
J'avais édité mon post après m'être rendu compte que j'avais initialidé 2 fois la JListe
Sting_6322

J'ai modifié mon code pour ne pas avoir à utiliser le modificateur final.

fredericmazue

Quote:

Cette partie ne donne toujours rien. Lorsque je clique sur une options de la JList, rien ne se passe

"Quel est le bruit produit par le battement d'une seule main ?"
Hakuin Zenji, Maître Zen du XVIII siècle,

Un arbre qui tombe dans la forêt fait-il du bruit s'il n'y a personne pour l'entendre ?

Bref quand tu envoies fireTableDataChanged, tu mets un évenement dans la file. Mais si persone n'écoute l'événement et n'y réagis ça ne va pas servir à grand chose. Qui va écouter ? Par exemple le composant ou le JFrame qui contient la Jtable à redessiner. Il devra donc implementer TableModelListener et définir une méthode dans cet esprit:

public void tableChanged(TableModelEvent tme)
{
  jTable1.updateUI();
}

Etant entendu que le modèle aura enregistré le composant écouteur par un
this.addTableModelListener(// le composant );

dans son cosntructeur par exemple.

Bon je crains que tu ne rencontres d'autres problèmes ensuite, mais je pense que je n'aurais plus le temps de t'aider avant un moment. Les fêtes... tout ça, et puis je pense t'avoir beaucoup aidé déjà.
Au fait, je vois que tu as édité un message pour en supprimer tout le contenu récemment. Ca ne va pas aider à suivre la discussion ceux qui voudrait prendre le relai et t'aider.