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 :

Impossible de fixer la hauteur d'un TableViewer


Sujet :

SWT/JFace Java

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Points : 49
    Points
    49
    Par défaut Impossible de fixer la hauteur d'un TableViewer
    Bonjour à tous,

    j'ai un tableau qui est contenu dans une section d'une page de propriété. Le tableau est rempli en fonction d'actions utilisateurs et je souhaite fixer sa hauteur à 5 lignes, par exemple, pour qu'ensuite la scrollBar verticale apparaisse.

    J'ai parcouru le net et le forum, essayé de multiples solutions et je n'arrive pas à fixer la hauteur de mon viewer. A chaque nouvelle ligne, il grandit et la section avec lui jusqu'à sortir par le bas de l'écran.

    voici le code que j'utilise :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    public void createControls(Composite parent,
    			TabbedPropertySheetPage aTabbedPropertySheetPage) {
    		super.createControls(parent, aTabbedPropertySheetPage);
     
    	      //create section
    	    Section section = getWidgetFactory().createSection(parent, ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED);
    		section.setText("Dashboard");
     
    		//create root compoiste
    		Composite rootParentComposite = getWidgetFactory().createFlatFormComposite(section);
     
    		//set layout to the root composite
    		TableColumnLayout tableColumnLayout = new TableColumnLayout();
    		rootParentComposite.setLayout(tableColumnLayout);
     
    		section.setClient(rootParentComposite);
     
    		//create the table
    		compareTable = new TableViewer(rootParentComposite, SWT.BORDER | SWT.V_SCROLL);
    		compareTable.getTable().setHeaderVisible(true);
    		compareTable.getTable().setLinesVisible(true);
     
    		//set the height to the table
    		int desiredHeight = compareTable.getTable().getItemHeight() * 5 + compareTable.getTable().getHeaderHeight();
    		GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
    		layoutData.heightHint = desiredHeight;
    		rootParentComposite.setLayoutData(layoutData);
     
    		//create the columns
    		createTablecolumn("", "", 250, tableColumnLayout);
    		createTablecolumn("Budget","Reference",150,tableColumnLayout);
    		createTablecolumn("Budget consolidated","",150,tableColumnLayout);
    		createTablecolumn("Estimate","",150,tableColumnLayout);
    		createTablecolumn("Estimate consolidated","",150,tableColumnLayout);
     
    		//set providers
    		compareTable.setContentProvider(new DashboardContentProvider(MyAdapterFactory.getAdapterFactory()));
    		compareTable.setLabelProvider(new DashboardLabelProvider(MyAdapterFactory.getAdapterFactory()));
     
    	}
     
    	private void createTablecolumn(String header, String toolTipText, int width, TableColumnLayout tableColumnLayout) {
    		TableViewerColumn columnViewer = new TableViewerColumn(compareTable, SWT.NONE);
    		columnViewer.getColumn().setResizable(false);
    		columnViewer.getColumn().setMoveable(false);
    		columnViewer.getColumn().setText(header);
    		columnViewer.getColumn().setToolTipText(toolTipText);
    		columnViewer.getColumn().setAlignment(SWT.CENTER);
    		tableColumnLayout.setColumnData(columnViewer.getColumn(), new ColumnPixelData(width));
    	}
    J'espère que vous pourrez me dire ce que je fais de mal, ou que je ne fais pas. Car je suis complètement perdu.

    Ogtraba

  2. #2
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Salut,

    Alors, c'est un comportement normal, dans ton cas.
    Puisque lorsque tu initialises ton GridData, tu lui dis qu'il peut prendre toute la place à la verticale...
    En fait, il te faudrait plutôt faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GridData layoutData = new GridData();
    layoutData.grabExcessHorizontalSpace = true;
    layoutData.horizontalAlignment = GridData.FILL;
    layoutData.heightHint = desiredHeight;
    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Points : 49
    Points
    49
    Par défaut
    merci pour ta réponse rapide Gueritarish,

    malheureusement, ça ne fonctionne pas. Le comportement reste le même qu'avant. Mon tableau grandit.

    une précision qui peut être importante, la section n'est pas forcément afficher quand l'utilisateur ajoute des lignes au tableau. L'utilisateur à la possibilité de consulter le tableau à postériori. Dans ce cas le tableau se créer avec une liste dès le départ.

    Donc il y a 2 possibilités, soit le tableau est créer vide, soit il est créer déjà rempli. Je ne sais pas si cela fait une différence.

  4. #4
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Du code que je vois, je dirais que tu utilises les Forms Eclipse.
    Peut-être que j'ai loupé un détail...
    Par contre, le fait que le tableau soit vide ou non, ne change rien à l'histoire. La place lui est réservé dans le layout.

    Forcément...
    Je viens de voir mon erreur... Tu utilises un TableColumnLayout.
    Tu ne peux pas lui passer de GridData. C'est mélanger les patates et les carottes.
    Donc, comme un TableColumnLayout ne peut être utiliser que dans un Container qui ne contenir qu'une Table comme enfant, il va te falloir agir sur le Composite parent. En l'occurrence, il va te falloir créer un autre Composite de haut niveau qui utilisera un GridLayout. Il te faut donc créer un parent à ton rootParentComposite.

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Points : 49
    Points
    49
    Par défaut
    D'accord, je me doutais un peu qu'il devait s'agir de ça.

    Je vais faire ce que tu dis, et je reviens vers vous avec une solution ou d'autres questions.

    merci

    Ogtraba

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Points : 49
    Points
    49
    Par défaut
    Tu as vu tout juste. Ça fonctionne super bien. j'ai renommer les variables dans le code pour que ce soit un peu plus clair.

    voici le code corrigé :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    public void createControls(Composite parent,
    			TabbedPropertySheetPage aTabbedPropertySheetPage) {
    		super.createControls(parent, aTabbedPropertySheetPage);
     
    	      //create section
    	    Section section = getWidgetFactory().createSection(parent, ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE | ExpandableComposite.EXPANDED);
    		section.setText("Dashboard");
     
    		//create parent of the parent :D
    		Composite rootParentComposite = new Composite(section, SWT.NONE);
    		rootParentComposite.setSize(section.getSize());
    		rootParentComposite.setLayout(new GridLayout());
     
    		//create root composite
    		Composite tableParentComposite= new Composite(rootParentComposite, SWT.NONE);  //getWidgetFactory().createFlatFormComposite(section);
     
    		//set layout to the root composite
    		TableColumnLayout tableColumnLayout = new TableColumnLayout();
    		tableParentComposite.setLayout(tableColumnLayout);
     
    		section.setClient(rootParentComposite);
     
    		//create the table
    		compareTable = new TableViewer(tableParentComposite, SWT.BORDER | SWT.V_SCROLL);
    		compareTable.getTable().setHeaderVisible(true);
    		compareTable.getTable().setLinesVisible(true);
     
    		//set the height to the table
    		int desiredHeight = compareTable.getTable().getItemHeight() * 5 + compareTable.getTable().getHeaderHeight();
    		GridData layoutData = new GridData();
    		layoutData.grabExcessHorizontalSpace = true;
    		layoutData.horizontalAlignment = GridData.FILL;
    		layoutData.heightHint = desiredHeight;
    		tableParentComposite.setLayoutData(layoutData);
     
     
    		//create the columns
    		createTablecolumn("", "", 250, tableColumnLayout);
    		createTablecolumn("Budget","Reference",150,tableColumnLayout);
    		createTablecolumn("Budget consolidated","",150,tableColumnLayout);
    		createTablecolumn("Estimate","",150,tableColumnLayout);
    		createTablecolumn("Estimate consolidated","",150,tableColumnLayout);
     
    		//set providers
    		compareTable.setContentProvider(new DashboardContentProvider(MDEAdapterFactory.getAdapterFactory()));
    		compareTable.setLabelProvider(new DashboardLabelProvider(MDEAdapterFactory.getAdapterFactory()));
     
    	}
    Par contre j'ai une question. Je ne fais pas de JFace depuis très longtemps et j'ai remarqué que pour que ça fonctionne il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableParentComposite.setLayoutData(layoutData);
    et pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rootParentComposite.setLayoutData(layoutData);
    Je ne comprends pas pourquoi il faut appliquer le layoutData sur le container de l'arbre et pas sur son parent. Si je le fais sur son parent le tableau ne prends pas toute la largeur de la section et la hauteur max n'est pas prise en compte.

    merci d'avance pour la réponse que tu apporteras à cette dernière question. Je vais passer le topic à résolu.

    Ogtraba

  7. #7
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Une image d'illustration pour aider (tu peux admirer mes talents pour Paint )


    C'est une image de ton IHM. Le Composite en noir est celui que tu reçois en argument. Tu ne connais pas son layout. Tu peux éventuellement lui en donner un, mais généralement, un Composite enfant est créé pour palier ce "problème" (ton rootParentComposite, en rouge). Ce Composite rouge, tu en maîtrises chaque aspect (c'est toi qui l'a créé). Donc, tu peux lui renseigner son layout et ainsi savoir comment placer les enfants à l'intérieur de celui-ci.
    Le Composite vert (tableParentComposite), qui ne va contenir que le TableViewer aura un layout qui arrange tout seul son contenu. Donc, si tu veux contraindre l'affichage de ton TableViewer, tu ne pourras pas passer par les données de layout (layoutData) de son parent.
    La seule solution qui reste est de contraindre l'affichage du Composite parent de ton TableViewer (dans ton cas, le Composite vert).
    C'est pourquoi, comme tu ne sais pas quel est le layout du Composite noir, tu es obligé de mettre en place le Composite vert à l'intérieur du Composite rouge.
    Donc, ce sera tableParentComposite.setLayoutData() qui sera la bonne solution.

    Voilà, à+
    Gueritarish
    Images attachées Images attachées  
    Pas de questions technique par MP, les forums sont là pour ça.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 187
    Points : 434
    Points
    434
    Par défaut
    Le positionnement en SWT se fait via deux infos :
    - le Layout qui donne le positionnement général des éléments (Control) dans un conteneur (Composite) : en grille, en ligne, ect.
    - les "LayoutData" (GridData...) qui donne des informations supplémentaires pour chaque élément (Control) : taille préférée, ancrages, méthode de remplissages etc.

    Voilà voilà

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/12/2009, 09h51
  2. Impossible de fixer champ discriminant
    Par Pietr57 dans le forum 4D
    Réponses: 1
    Dernier message: 04/02/2008, 15h30
  3. Fixer la hauteur d'un div
    Par Core8 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 28/07/2007, 12h24
  4. [HTML] Problème avec DIV, impossible de mettre la hauteur à 100% !!
    Par keyser.greg dans le forum Balisage (X)HTML et validation W3C
    Réponses: 14
    Dernier message: 01/03/2007, 11h46
  5. [CR11] Fixer la hauteur de colonnes
    Par say dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 16/06/2006, 12h26

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