1

Après pas mal de recherche, je ne trouve pas de solutions qui pourraient pallier à mon problème.

Explication : Je dois en gros afficher des diagrammes :
-en fonction des indicateurs demandés (performance de l'entreprise, nombre de ventes, etc (exemples bidons))
-en fonction de dates (sur telle semaine, sur tel mois, du ... au ...)

En gros, pour faire ceci, j'ai un JPanel d'affichage du diagramme, un JPanel contenant des JTextField contenant les dates choisies par l'utilisateur et un JTree permettant de choisir le type d'indicateur voulu.

Quand je change la valeur du noeud selectionné dans le JTree, il charge la classe correspondante au diagramme requi dans le JPanel d'affichage. Pour chaque diagramme, j'ai une classe différente. Quand l'évenement de changement de valeur du JTree est déclenché, je vais en fait rechercher le nom de la classe correspondant au graphique attendu et je l'affiche dans le JPanel d'affichage grace au methode getClassName et getDelcaredMethod qui renvoie la méthode (retournant un JPanel) de ma classe de diagramme. embarrassed Trop complexe mais j'ai pas trouvé mieux.

J'aimerais pouvoir envoyer les dates qui se trouvent dans les TextFields à mes classes de diagrammes quand je change la valeur du noeud selectionné du JTree.

Je ne sais pas si c'est possible, et si c'est le cas, est ce que vous aurez une autre solution au niveau de la stucture qui soit ergonomique ?

Merci

Matthieu

2

Je n'ai pas trop compris ton architecture :/
Tu peux expliciter ? (screenshot, pseudo-code, etc.)
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

3

Pas de problème.

Grossomodo.

J'ai un JTree à gauche, et un JPanel à droite (ou sera affiché le diagramme) comme voici :
[URL=http://img133.imageshack.us/my.php?image=sanstitrept2.jpg][IMG]http://img133.imageshack.us/img133/9199/sanstitrept2.th.jpg[/IMG][/URL]

Chaque diagramme représente une classe différente (ayant un lien avec une BD, et la librairie graphique).

Je charge en fait ces classes "graphiques" dans le JPanel de droite (où il y a le diagramme). Bien évidement, je n'appelle pas les même classes suivant le noeud séléctionné dans le JTree.

Pour chargé la bonne classe j'ai procédé comme ceci :

remplissage du JTree (exemple pour 1 noeud)
DefaultMutableTreeNode root = new DefaultMutableTreeNode("GDC_Reporting");
DefaultMutableTreeNode root1 = new DefaultMutableTreeNode("Chiffres", true);
DefaultMutableTreeNode n1 = new DefaultMutableTreeNode(new GDCDescription("GDC.Chart.ItemLabelDemo1", "ItemLabelDemo1.java"));
//GDC.Chart.ItemLabelDemo1 -> nom de la classe associée à l'élément
//ItemLabelDemo1.java  -> label de l'élement
root1.add(n1); 
root.add(root1);


Lors de l'evenement déclenché lorsque l'on change d'élément dans le JTree, je fait:
public void valueChanged(TreeSelectionEvent event) {
   - recuperation de l'element selectionné
   - recuperation de la classe correspondante
   - appel d'une méthode de la classe avec :
    //c correspond a la classe du diagramme
    Method m = c.getDeclaredMethod("createGDCPanel",null);/*createGDCPanel est une methode se retrouvant dans toute les classe de diagramme et retournant un Panel contenant le diagramme*/
    JPanel panel = (JPanel) m.invoke(null, null);
    }


Jusque là tout marche bien. Le problème c'estq ue je dois aussi prendre en compte des date de début et de fin pour faire mes requète sur la BD et générer des diagrammes correspondants. Et je ne sais pas comment faire. Est-ce possible avec cette structure ? Dois-je refaire ma structure (je dois terminer avant vendredi) ?

Merci

J'espere que tu auras un peu mieux saisi ma demande sasume. Merci

Matthieu

4

Les classes contenant la méthode createGDCPanel, c'est toi qui les a écrites ? Elles viennent d'où ? Elles héritent de quelle(s) classes ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

5

je les ai adaptées à partir d'exemple. Elles n'héritent de rien. Elles utilisent une librairie JAVA JFreeChart permettant de générer n'importe quel type de diagramme (qui utilise Graphics2D si je me souviens bien).
Si tu veux une démonstration de la librairie, il y en a une ici : http://www.jfree.org/jfreechart/jfreechart-1.0.2-demo.jnlp. La librairie est gratuite mais la documentation payante, j'ai du donc l'acheter. Et dans cette documentation, se trouve le code source de cet exemple dont je me suis servi pour faire mon appli.

6

Ah, donc c'est toi qui les a écrites, ces classes !
C'est plus facile alors : tu peux tirer parti des interfaces de Java : toutes tes classes générant les diagrammes devront implémenter une interface GDCChart par exemple (ou avec un meilleur nom grin), qui fournira une méthode createGDCPanel() avec les arguments qui vont bien pour que tu puisses faire ta requête et renvoyer le diagramme qui va bien smile
Le JTree devra avoir pour modèle une liste d'objets implémentant l'interface GDCChart.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

7

Oui c'est comme ca que je voulais modéliser au départ. Le truc c'est que le seul lien entre ma classe appelante (ma classe principale) et mon interface GDCCharts est ceci.
Class c = Class.forName(this.GDCDescription.getClassName());
        Method m = c.getDeclaredMethod("createGDCPanel", null);
        JPanel panel = (JPanel) m.invoke(null, null);


Je viens de lire un peu de doc sur getDeclaredMethod() et invoke() et apparement je peux envoyer des paramètre avec. DOnc le problème serait résolu. Voila ce que j'ai fais:

Class c = Class.forName(this.GDCDescription.getClassName());
Object chart = c.newInstance();
Class params[] = {String.class, String.class};
Object paramsObj[] = {app.jc_deb.getDate().toString(),app.jc_deb.getDate().toString()};//les dates a envoyer             
Method m = c.getDeclaredMethod("createGDCPanel", params);
JPanel panel = (JPanel) m.invoke(chart, paramsObj);


En gros ca marche je récupère les dates pour faire mes requetes. Je vais quand même refaire ma structure comme tu me la dit avec un interface, c'est plus propre.

Merci a toi Sasume. A la prochaine. Si ta des questions ou des recommandations pour améliorer mon code, je suis tout ouï

Matthieu

8

Bah c'est bon, ce que tu fais là, mais en fait tu refais le boulot du compilateur : si tu utilisais la technique des interfaces (ou une classe mère), tu n'aurais pas besoin de faire passer par tout ton bazar.
(et accessoirement, tu bénéficierais des possibilités de vérification de types du compilateur, ce qui te faciliterait le débuggage par exemple)
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »