Précédent   Forum du club des développeurs et IT Pro > Java > Interfaces Graphiques en Java > SWT/JFace
SWT/JFace Forum d'entraide pour les API SWT/JFace. Avant de poster -> FAQ SWT/JFace
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 13/07/2012, 18h23   #1
Péchereau
Futur Membre du Club
 
Inscription : mai 2003
Messages : 67
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 67
Points : 19
Points : 19
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 :
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.
Péchereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2012, 11h36   #2
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 589
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 28
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 589
Points : 3 549
Points : 3 549
Salut,

Il te suffit d'indiquer une taille pour la hauteur dans le GridData de ton TableViewer. Ex:
Code :
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.

Le 5 et 6 juin à Toulouse, la première EclipseCon France !
Gueritarish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2012, 15h08   #3
Péchereau
Futur Membre du Club
 
Inscription : mai 2003
Messages : 67
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 67
Points : 19
Points : 19
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 ...
Péchereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2012, 15h20   #4
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 589
Détails du profil
Informations personnelles :
Nom : Homme Marc
Âge : 28
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 589
Points : 3 549
Points : 3 549
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 :
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.

Le 5 et 6 juin à Toulouse, la première EclipseCon France !
Gueritarish est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2012, 17h12   #5
Péchereau
Futur Membre du Club
 
Inscription : mai 2003
Messages : 67
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 67
Points : 19
Points : 19
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 :
//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 ?
Péchereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2012, 17h23   #6
Péchereau
Futur Membre du Club
 
Inscription : mai 2003
Messages : 67
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 67
Points : 19
Points : 19
Par tâtonnement, je pense qu'en mettant un "minimumHeight" au niveau du layoutData du "group" je pourrais m'en sortir :
Code :
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");
Péchereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2012, 18h16   #7
Péchereau
Futur Membre du Club
 
Inscription : mai 2003
Messages : 67
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 67
Points : 19
Points : 19
Après quelques tests manuels, j'en conclus que ça marche pas trop mal avec la solution énoncée ci-dessus !
Merci Gueritarish !
Péchereau est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h09.


 
 
 
 
Partenaires

Hébergement Web