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 :

Spécifier taille verticale d'un Group ou d'une TableViewer


Sujet :

SWT/JFace Java

  1. #1
    Membre du Club
    Inscrit en
    Mai 2003
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 71
    Points : 52
    Points
    52
    Par défaut Spécifier taille verticale d'un Group ou d'une TableViewer
    Bonjour à tous,

    Dans mon application, j'ai un écran qui possède 2 tableaux l'un en dessous de l'autre.
    Le problème est, qu'au niveau affichage, quand le premier tableau possède beaucoup d'éléments, je ne vois plus le second tableau. Je ne sais trop comment limiter la taille verticale du premier tableau (par exemple, à la moitié de la fenêtre). Comment faire ?

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    createSearchZone(); // un tableau qui prend trop de place ... 
    createQueueZone(); // un autre tableau qui n'apparat plus à l'écran !
     
    Button create = new Button(parent, SWT.CENTER);
    create.setText("Create");
    // association d'un Listener au bouton "Create"
     
    // ... 
    // methodes : 
    	private void createSearchZone() {
    		Group group = new Group(parent, SWT.NONE);
    		group.setText("Search Trade Request");
     
    		GridLayout gridLayout = new GridLayout();
    		gridLayout.numColumns = 9;
    		group.setLayout(gridLayout);
     
    		GridData gridData = new GridData(GridData.FILL, GridData.BEGINNING, true, true);
    		gridData.horizontalSpan = 2;
    		group.setLayoutData(gridData);
     
    		createSearchCriteriaZone(group); // bandeau de critères de recherche / filtre 
    		createSearchResultZone(group);  // ce sera ce tableau qui prend trop de place !!!
     
    		gridData = new GridData(GridData.END, GridData.FILL, true, false);
    		gridData.horizontalSpan = 9;
    		gridData.minimumWidth = 100;
    		nbResult = new Label(group, SWT.NONE);
    		nbResult.setText("Result : 0");
    		nbResult.setLayoutData(gridData);
     
                    // remplissage du tableau "search result" avec des données 
    	}
     
    	private void createSearchResultZone(Group aParent) {
    		tradeRequestResultTableViewer = new TableViewer(aParent, SWT.BORDER | SWT.FULL_SELECTION);
    		GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, true);
    		gridData.horizontalSpan = 9;
     
    		tradeRequestResultTableViewer.getControl().setLayoutData(gridData);
    		tradeRequestResultTableViewer.setContentProvider(new IStructuredContentProvider() {
    			@Override
    			public Object[] getElements(Object inputElement) {
    				return (Object[]) inputElement;
    			}
     
    			@Override
    			public void dispose() {
    			}
     
    			@Override
    			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
    			}
    		});
     
                    // creation des colonnes 
     
    		Table codeTable = (Table) tradeRequestResultTableViewer.getControl();
    		codeTable.setHeaderVisible(true);
     
    		setMenuForTradeRequestTableViewer(tradeRequestResultTableViewer);
     
    	}
     
    	private void createQueueZone() {
    		Group group = new Group(parent, SWT.NONE);
    		group.setText("Queue Trade Request");
     
    		GridLayout gridLayout = new GridLayout();
    		group.setLayout(gridLayout);
     
    		GridData gridData = new GridData(GridData.FILL, GridData.FILL, true, true);
    		gridData.horizontalSpan = 2;
    		group.setLayoutData(gridData);
     
    		tradeRequestQueueTableViewer = new TableViewer(group, SWT.BORDER | SWT.FULL_SELECTION);
    		gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
    		tradeRequestQueueTableViewer.getControl().setLayoutData(gridData);
    		tradeRequestQueueTableViewer.setContentProvider(new IStructuredContentProvider() {
    			@Override
    			public Object[] getElements(Object inputElement) {
    				return (Object[]) inputElement;
    			}
     
    			@Override
    			public void dispose() {
    			}
     
    			@Override
    			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
    			}
    		});
     
                    // Création des colonnes 
     
    		Table codeTable = (Table) tradeRequestQueueTableViewer.getControl();
    		codeTable.setHeaderVisible(true);
     
                    // remplissage du tableau avec des données
    	}
    Merci d'avance.

  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,

    Il te suffit d'indiquer une taille pour la hauteur dans le GridData de ton TableViewer. Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, true);
    gridData.horizontalSpan = 9;
    gridData.heightHint = 200;
    tradeRequestResultTableViewer.getControl().setLayoutData(gridData);
    Tu peux aussi rajouter des scrollbars à ton TableViewer en ajoutant les styles SWT.H_SCROLL et SWT.V_SCROLL.

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

  3. #3
    Membre du Club
    Inscrit en
    Mai 2003
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 71
    Points : 52
    Points
    52
    Par défaut
    Je vais bientôt tester ta proposition.
    Toutefois, j'ai une question : dans ton exemple, si j'ai bien compris, cela permet de fixer une hauteur précise (donc une hauteur absolue) du tableau.
    Et comment faire pour fixer une hauteur relative du tableau ? (par exemple, chaque tableau prend 45% de la hauteur de la fenêtre) car la vue qui contient ces 2 tableaux peut parfaitement avoir sa taille modifiée ...

  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
    Tu ne pourras pas fixer une vrai taille en pourcentage. Par contre, tu peux donner aux layouts des indications sur la façon dont doivent se comporter les tableaux en cas de redimensionnement.
    Par exemple, si tu donnes un GridData(SWT.FILL, SWT.FILL, true, true) à tes Group, alors ils vont prendre toutes la place disponibles lors du redimensionnement. Il te suffit de faire la même chose pour les TableViewer à l'intérieur de tes Group pour avoir le même comportement.
    Un exemple complet:
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    import org.eclipse.jface.viewers.ArrayContentProvider;
    import org.eclipse.jface.viewers.LabelProvider;
    import org.eclipse.jface.viewers.TableViewer;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Group;
    import org.eclipse.swt.widgets.Shell;
     
    public class TableSnippet {
     
      public static class MyModel {
        public int counter;
     
        public MyModel(final int counter) {
          this.counter = counter;
        }
     
        @Override
        public String toString() {
          return "Item " + this.counter;
        }
      }
     
      /**
       * @param args
       */
      public static void main(final String[] args) {
        final Display display = new Display();
        final Shell shell = new Shell(display);
        shell.setLayout(new GridLayout(1, false));
     
        final Composite composite = new Composite(shell, SWT.NONE);
        composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        composite.setLayout(new GridLayout(2, false));
     
        final Group group = new Group(composite, SWT.NONE);
        final GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
        layoutData.horizontalSpan = 2;
        group.setLayoutData(layoutData);
        group.setText("Search");
     
        final GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 9;
        group.setLayout(gridLayout);
     
        final TableViewer viewer =
          new TableViewer(group, SWT.FULL_SELECTION | SWT.BORDER | SWT.V_SCROLL
              | SWT.H_SCROLL);
        final GridData viewerData = new GridData(SWT.FILL, SWT.FILL, true, true);
        viewerData.horizontalSpan = 9;
        viewer.getControl().setLayoutData(viewerData);
        viewer.setContentProvider(ArrayContentProvider.getInstance());
        viewer.setLabelProvider(new LabelProvider());
        viewer.setInput(createModel(500));
     
        final Group group2 = new Group(composite, SWT.NONE);
        final GridData layoutData2 = new GridData(SWT.FILL, SWT.FILL, true, true);
        layoutData2.horizontalSpan = 2;
        group2.setLayoutData(layoutData2);
        group2.setText("Query");
     
        final GridLayout gridLayout2 = new GridLayout();
        gridLayout2.numColumns = 9;
        group2.setLayout(gridLayout2);
     
        final TableViewer viewer2 =
          new TableViewer(group2, SWT.FULL_SELECTION | SWT.BORDER | SWT.V_SCROLL
              | SWT.H_SCROLL);
        final GridData viewerData2 = new GridData(SWT.FILL, SWT.FILL, true, true);
        viewerData2.horizontalSpan = 9;
        viewer2.getControl().setLayoutData(viewerData2);
        viewer2.setContentProvider(ArrayContentProvider.getInstance());
        viewer2.setLabelProvider(new LabelProvider());
        viewer2.setInput(createModel(500));
     
        shell.pack();
        shell.setMinimumSize(400, 300);
        shell.setSize(500, 400);
        shell.setText("Table Test");
        shell.open();
        while (!shell.isDisposed()) {
          if (!display.readAndDispatch())
            display.sleep();
        }
        display.dispose();
      }
     
      private static MyModel[] createModel(final int amount) {
        final MyModel[] elements = new MyModel[amount];
     
        for (int i = 0; i < amount; i++) {
          elements[i] = new MyModel(i);
        }
     
        return elements;
      }
    }
    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  5. #5
    Membre du Club
    Inscrit en
    Mai 2003
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 71
    Points : 52
    Points
    52
    Par défaut
    Ton petit exemple est très bien et très didactique, je ne sais si tu l'as codé toi même vite fait ou si tu l'as récupéré d'une doc d'Eclipse / SWT.
    Mais c'est parfait, en partant de cette TableSnippet, je vais pouvoir illustrer mieux mon souci.

    Dans la TableSnippet, en effet, les 2 tableaux prennent chacun la moitié de l'écran ... et pour cause, les 2 tableaux ont le même type de positionnement ET ont chacun le même nombre d'éléments à afficher.
    Mon problème se pose quand l'un des deux tableaux n'a pas d'éléments (par exemple, le premier), et l'autre en a ... disons un certain nombre.
    Alors, en commentant dans TableSnippet le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //viewer.setInput(createModel(500));
    et qu'on relance l'exemple, on ne voit plus apparaître que le second tableau qui est dans le Group "Query". Le premier tableau et le Group "Search" a, quand à lui, complètement disparu.
    Que faire alors dans ce cas ?

  6. #6
    Membre du Club
    Inscrit en
    Mai 2003
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 71
    Points : 52
    Points
    52
    Par défaut
    Par tâtonnement, je pense qu'en mettant un "minimumHeight" au niveau du layoutData du "group" je pourrais m'en sortir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    final Group group = new Group(composite, SWT.NONE);
    final GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
    layoutData.horizontalSpan = 2;
    layoutData.minimumHeight = 200; // rajouté
    group.setLayoutData(layoutData);
    group.setText("Search");
    // ... 
    final Group group2 = new Group(composite, SWT.NONE);
    final GridData layoutData2 = new GridData(SWT.FILL, SWT.FILL, true, true);
    layoutData2.horizontalSpan = 2;
    layoutData2.minimumHeight = 200; // rajouté
    group2.setLayoutData(layoutData2);
    group2.setText("Query");

  7. #7
    Membre du Club
    Inscrit en
    Mai 2003
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 71
    Points : 52
    Points
    52
    Par défaut
    Après quelques tests manuels, j'en conclus que ça marche pas trop mal avec la solution énoncée ci-dessus !
    Merci Gueritarish !

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

Discussions similaires

  1. Problème de taille verticale d'une page
    Par cynoq dans le forum Mise en page CSS
    Réponses: 8
    Dernier message: 25/03/2010, 12h10
  2. Réponses: 4
    Dernier message: 19/06/2008, 15h30
  3. Ajustage auto de la taille verticale d'une figure
    Par Tatanka dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 2
    Dernier message: 20/10/2007, 23h24
  4. Taille du pied de groupe d'un état
    Par lito74 dans le forum IHM
    Réponses: 1
    Dernier message: 12/04/2006, 07h37
  5. La taille verticale de mes panels
    Par szdavid dans le forum Débuter
    Réponses: 7
    Dernier message: 21/04/2004, 11h10

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