IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SWT/JFace Java Discussion :

Génération dynamique d'IHM en SWT


Sujet :

SWT/JFace Java

  1. #1
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut Générer dynamiquement un IHM en SWT
    Bonjour à tous,

    Je reviens avec une nouvelle question pour laquelle j'espere que vous m'aideriez à trouver une solution.

    Toujours dans le compte du developpement de mon application RCP, je dois pouvoir créer une vue dans laquelle se trouvent des champs (zones de saisies, combo, ...) me permettant d'éffectuer un filtre. Jusqu'ici rien de spécial. La difficulté vient du fait que, je dispose dans une autre vue, d'un tableViewer contenant mes données. Ces données proviennent de l'éxécution d'une procédure stockée dans une base de données. Je ne connais ni la nature des données, ni celle des colonnes (type et nom), encore moins le nombre de colonnes qui vont être renvoyés par l'éxécution de ma proc stock.

    Je voudrais donc, dans une autre vue, créer un interface me permettant d'effectuer un filtre sur les données de ma tableViewer. Ce filtre devra donc reprendre toutes les colonnes présente dans ma table et en fonction du type de la colonne, créer le champ adéquat de la maniere suivante :
    - colonne de type text : -> label + text
    - colonne de type numérique : -> label + combo(<,>,=) + text

    La première chose que j'ai faite a été de créer des classe me permettant de d'intancier des objets de cette nature. Classes que j'utiliserais ensuite dans le createPartControl de ma vue . Par exemple, pour le type text, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public class LabelText extends Composite {
     
    		public LabelText(Composite parent, String label, String textf) {
     
    			super(parent, SWT.NONE);
    			GridLayout myGL = new GridLayout(2, false);
    			this.setLayout(myGL);
    			Label myLabel = new Label(this, SWT.NONE);
    			myLabel.setText(label);
    			Text myText = new Text(this,SWT.BORDER);
    			myText.setText(textf);
    			GridData myGD = new GridData(GridData.FILL_BOTH);
    			myText.setLayoutData(myGD);
    		}			
    	}
    Etant débutant en SWT/JFace et RCP, et malgré l'idée que je vous ai présenté ci haut, je n'arrive toujours pas à voir comment générer de manière dynamique (en fonction des colonnes provenant de ma base de données) mon écran.

    Je voudrais voir avec vous si vous avez une meuilleure manière pour faire cela et si vous avez déjà été confronté à un problème de la sorte.

    merci pour tout

  2. #2
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut
    Bsr à tous!

    J'ai un tout petit peu avancé sur la question. Je ne m'y suis remis qu'aujourd'hui d'ailleurs. Je suis donc resté sur l'idée que présentée ci haut, en ajoutant donc une autre classe interne qui me permettrais donc de créer un composite LabelText(label + text), et un composite LabelText(label + combo + text). Le code du second composite étant le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    public class LabelComboText extends Composite {
     
    		public LabelComboText (Composite parent, String label, String text){
    			super(parent, SWT.NONE);
     
    			GridLayout myGL = new GridLayout(3, false);
    			this.setLayout(myGL);
     
    			// le label
    			Label myLabel = new Label(this, SWT.NONE);
    			myLabel.setText(label);
     
    			// le combo
    			Combo myCombo = new Combo(this, SWT.READ_ONLY);
    			String items[] = {"<", "<=", "=", ">=", ">"};
    			myCombo.setItems(items);			
     
    			// la zone de texte
    			Text myText = new Text(this,SWT.BORDER);
    			myText.setText(text);			
    		}
    Le code source de la méthode createPartControl de ma vue est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    public void createPartControl(Composite parent) {
     
    		GetFields(); // Methode permettant de récuperer les infos (nom et type) sur les colonnes provenant de la base de données
     
    		myWidgets = new ArrayList<Composite>();
    		LabelText lblText;		
    		LabelComboText lblComboText;
     
    		GridLayout myLayout = new GridLayout((titles.length)/2, false);
    		parent.setLayout(myLayout);
     
    		for (int i=0; i<titles.length ; i++ ){
    			if(types[i] == String.class){
    				System.out.println("labeltext");
    				lblText = new LabelText(parent, titles[i], "");				
    				myWidgets.add(lblText);
    			}else if ((types[i] == Double.class) || (types[i] == Integer.class)) {
    				System.out.println("labelComboText");
    				lblComboText = new LabelComboText(parent, titles[i], "");				
    				myWidgets.add(lblComboText);
    			}				
    		}		
     
    		GridData myGD = new GridData(GridData.FILL_VERTICAL);
    		for (Composite myW: myWidgets) {
    			myGD.verticalSpan = (titles.length)/2;
    			myW.setLayoutData(myGD);			
    		}
     
    	}
    Le résultat obtenu n'est pas vraiment (il en est loin dailleurs) ce que je voudrais.

    Je rapelle juste que dans mon application RCP, je dispose d'une vue dans la quelle je dois concevoir une IHM en SWT. Les données (types et non des champs) me permettant de concevoir cet IHM ne sont pas connues à l'avance et proviennent de l'éxcution d'une procédure stockée dans une base de données. Je ne connais donc pas à l'avance la nature et le nombre de mes objets.

    D'autres parts, je voudrais, dans un souci d'esthétisme pouvoir adapter la taille de ma vue en fonction des données qui seront présentes. En d'autres termes, en imagineant par exemple que ma procédure stockée me renvoie 12 champs, j'aimerais par exemple avoir 4 colonnes et 3 lignes, et adapter les dimensions de ma vue en fonction de cela.

    Voilà donc, ce qui me tracasse en ce moment. Si quelqu'un a une quelconque idée, jsuis prenneur.

    Merci à tous

  3. #3
    Membre Expert
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Par défaut
    Bonsoir,

    Ta tache est tres ambitieuse et complexe. Personnelement je partirais sur une autre solution que tu as commence (creer l'UI SWT a partir d'une procedure stockée) car je pense que ton code va vite devenir une usine a gaz et pour debugger les problemes d'affichage ca risque d'etre tres complique.

    Moi je partirais sur une solution declarative de l'UI qui est ensuite interpret een SWT, autrement dit ta procedure stockée genere un flux XML qui decrit ton UI et ensuite tu inteprete ce XML en UI SWT. Pour la derniere partie Eclipse E4 bosse sur le sujet des UI declarative avec XWT par exemple. Il se trouve dans le CVS Eclipse (faut chercher E4 puis XWT un truc comme ca).

    Avec une solution declarativ etu pourras generer le flux XML dans un fichier par ex et trouver plus facilement les bugs eventuels.

    Bon courage.

    Angelo

  4. #4
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 142
    Par défaut
    Merci angelo pour ta réponse.

    J'ai jetté un coup d'oeuil à XWT, et c'est vrai que cela pourrait m'aider à faire ce que j'ai envie de faire. Cependant, étant débutant, je ne préfère pas me lancer là dedans. De plus, de ce que j'ai vu, dans le contenu des fichiers xml, on devra de toutes facons préciser les layout. Et je crois que c'est justement sur ce point que je bloque.

    Au jour d'aujourd'hui, j'arrive à générer un ui avec les données qui me sont renvoyées après l'exécution de ma proc stock. Pour rappel, selon le type qui m'est renvoyé, je génère sois un labelText(label + text), sois un labelComboText(label + combo + text). Le code des classes permettant de générer de tels objets est dans les posts plus haut. J'utilise aujourd'hui un RowLayout, ce qui me permet d'avoir les résultats suivants en pièce jointes. En utilisant ce Layout, j'arrive donc à pouvoir faire adapter la taille de ma vue avec les composants y présents.

    Cependant, je trouve cela toujours "moche", et je voudrais combiner le GridLayout avec le RowLayOut, mais je ne sais pas comment m'y prendre. De plus, je voudrais adapter la taille de départ de ma vue, les paramètres du GridLayOut(le nombre de colonnes et de lignes ) en fonction des données qui me seront données par ma méthode GetFields(qui me renvoie les infos sur les colonnes).

    Et pour finir, je commence déjà à reflechir à une autre question qui se profile à l'horizon qui est la question du comment je vais recupérer les données saisies par l'utilisateur, sachant que je n'utilise pas directement des objets swt, mais des objets que j'ai "crée". De plus, une fois que j'aurais bien fai l'ui et j'aurais recupérer les donénes saisies, comment utiliser ses données pour influencer une autre vue. En d'autres termes, les champs de ma vue constituent un filtre dont l'application va appliquer les données affichées dans un tableViewer d'une autre vue.

    Voilà et merci beacoup pour votre aide.
    Images attachées Images attachées   

  5. #5
    Membre Expert
    Avatar de azerr
    Homme Profil pro
    Ingénieur Etude JEE/Eclipse RCP
    Inscrit en
    Avril 2006
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Etude JEE/Eclipse RCP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 942
    Par défaut
    Bonjour

    J'ai jetté un coup d'oeuil à XWT, et c'est vrai que cela pourrait m'aider à faire ce que j'ai envie de faire. Cependant, étant débutant, je ne préfère pas me lancer là dedans. De plus, de ce que j'ai vu, dans le contenu des fichiers xml, on devra de toutes facons préciser les layout. Et je crois que c'est justement sur ce point que je bloque.
    En effet, la gestion des layout est LE TRUC que je deteste aussi. Le probleme avec les layout c'est que c'est tres difficile de gerer des layout complexes avec un seul type de layout.

    Je pense que MigLayout pourrais bien t'aider car tu peux décrire tes layout sous forme de string et ca utilise un seul Layout (MigLayout) qui est capable de gerer des rowspans, ds colspan, des cellules.... On peut faire des trucs de fou mais faut prendre le temps de tester toutes ces capacites.

    Cependant, je trouve cela toujours "moche", et je voudrais combiner le GridLayout avec le RowLayOut, mais je ne sais pas comment m'y prendre.
    Regarde MigLayout

    Et pour finir, je commence déjà à reflechir à une autre question qui se profile à l'horizon qui est la question du comment je vais recupérer les données saisies par l'utilisateur, sachant que je n'utilise pas directement des objets swt, mais des objets que j'ai "crée".
    Il va falloir que tu mettes en place je pense une classe controlleur generique qui est capable de recuperer tes controles SWT (que tu pourras mettre dans une MAP avec des id) qui est capable de faire ca. Par ex, tu generes un Vutton Save qui appelle la method save de la classe controlleur qui itere sur chacune des widgets generes et tu fait ton traitement. Si tu regardes XWT
    ils ont cette problemetaique, tu as une classe Java (un controlleur) associe
    a ta description XML de ton UI et tu appelles des methodes java.

    De plus, une fois que j'aurais bien fai l'ui et j'aurais recupérer les donénes saisies, comment utiliser ses données pour influencer une autre vue. En d'autres termes, les champs de ma vue constituent un filtre dont l'application va appliquer les données affichées dans un tableViewer d'une autre vue.
    La c'est pareil il v afalloir que tu ait uen classe controlleur qui fasse ca.

    Tu es debutant et honnetement (je ne veux pas te decourager) ton sujet est hyper compliqué.

    Bon courage!

    Angelo

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/09/2013, 17h13
  2. VB - Génération dynamique de controles dans un forme
    Par jeanangel dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/12/2005, 21h09
  3. [DOM] Génération dynamique fichier xml
    Par Fabouney dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 03/10/2005, 09h45
  4. [SQL*Plus] génération dynamique du fichier de spool
    Par lalystar dans le forum Oracle
    Réponses: 3
    Dernier message: 06/12/2004, 10h44
  5. Réponses: 7
    Dernier message: 22/10/2004, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo