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 :

[SWT] shell.pack() trop packed


Sujet :

SWT/JFace Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 18
    Par défaut [SWT] shell.pack() trop packed
    Bonjour tout le monde !

    J'ai un gros souci avec la taille de ma fenêtre ...
    Il s'agit d'un plugin project très simple pour l'instant. J'ai ajouté 2 viewparts à mon application RCP mais quand j'utilise shell.pack(), la taille de ma fenêtre est trop reduite, on ne voit plus que les onglets et le haut de mes boutons, sans le tableau ni autres widgets ...

    Mon application est composée ainsi :
    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
    - Shell
        - viewpart1(GridLayout(1 colonne))
            - TableViewer(5 TableColumn)
            - Composite(RowLayout)
                - button1
                - button2
        - viewpart2(GridLayout(2 colonnes)
            - Label
            - Text
            - Label
            - Text
            - Label
            - Text
            - Composite(RowLayout)
                - button1
                - button2
    Mon tableau et mes colonnes ont la bonne taille, les autres widgets aussi ...
    Y a-t-il un moyen d'obtenir la taille idéale de ma fenêtre pour mes viewparts ?

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Par défaut
    Bonsoir,

    As-tu associé un GridData contenant les paramètres "widthHint" et "heightHint" à chacun de tes widgets ?

    Laurent

  3. #3
    Membre chevronné Avatar de desert
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 414
    Par défaut
    le shell.pack(), tu le fais à quel endroit exactement ?

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 18
    Par défaut
    Merci de m'aider ... RCP c'est pas rose tous les jour pour un débutant

    J'ai configuré mon GridData mais aucun changement ...

    Et j'appelle le shell.pack() à la fin du createPartControl :

    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
    {
    		RowLayout loParent = new RowLayout(SWT.VERTICAL);
    		loParent.fill = true;
    		loParent.justify = true;
    		parent.setLayout(loParent);
     
    		// Viewer de la table
    		Composite cTable = new Composite(parent, SWT.NONE);
    		cTable.setLayout(new GridLayout(1, false));
    		tViewer = new TableViewer(cTable, SWT.FULL_SELECTION | SWT.SINGLE | SWT.V_SCROLL | SWT.BORDER);
    		tViewer.setContentProvider(new ViewContentProvider());
    		tViewer.setLabelProvider(new ViewLabelProvider());
    		tViewer.setInput(personnes);
     
    		// Contenu de la table
    		Table t = tViewer.getTable();
    		t.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    		new TableColumn(t, SWT.CENTER).setText(colonnes[0]);
    		new TableColumn(t, SWT.CENTER).setText(colonnes[1]);
    		new TableColumn(t, SWT.CENTER).setText(colonnes[2]);
    		new TableColumn(t, SWT.CENTER).setText(colonnes[3]);
    		TableColumn tableColumn = new TableColumn(t, SWT.CENTER);
    		tableColumn.setText(colonnes[4]);
    		t.setHeaderVisible(true);
    		t.setLinesVisible(true);
     
    		// Données affichées
    		personnes.add(new [...]
    		tViewer.refresh();
     
    		// Taille auto
    		for (int i = 0, n = t.getColumnCount(); i < n; i++) {
    			t.getColumn(i).pack();
    		}
    		t.pack(true);
     
    		// zone des boutons
    		Composite cButtons = new Composite(parent, SWT.NONE);
    		RowLayout loButtons = new RowLayout(SWT.HORIZONTAL);
    		loButtons.pack = false;
    		loButtons.justify = true;
    		cButtons.setLayout(loButtons);
    		// bouton fiche
    		Button fiche = new Button(cButtons, SWT.PUSH | SWT.CENTER);
    		fiche.setText("Fiche");
    		// Bouton quitter
    		Button quitter = new Button(cButtons, SWT.PUSH);
    		quitter.setText("Quitter");
    		cButtons.layout();
     
    		// Affichage
    		parent.pack();
    		parent.getShell().pack();
    	}
    Par contre contrairement a mon premier post, on voit le haut du tableau a présent (et non plus le haut des boutons) suite à une modification du layout du parent.

    Je vais continuer à chercher du coté des width et heigh mais j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		layoutData.minimumHeight = 200;
    		layoutData.minimumWidth = 200;
    		layoutData.heightHint = 200;
    		layoutData.widthHint = 200;
    Pas de changement si ce n'est la taille de ma table ...

    Sinon j'ai aussi essayé de modifier le datagrid de mon parent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	public void createPartControl(Composite parent) {
     
    		RowLayout loParent = new RowLayout(SWT.VERTICAL);
    		loParent.fill = true;
    		loParent.justify = true;
    		parent.setLayout(loParent);
    		GridData loDataParent = new GridData(SWT.FILL, SWT.FILL, true, true);
    		loDataParent.minimumHeight = 200;
    		loDataParent.minimumWidth = 200;
    		loDataParent.heightHint = 200;
    		loDataParent.widthHint = 200;
    		parent.setLayoutData(loDataParent);
    ...
    Aucun effet ...

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Par défaut
    Salut,

    Merci pour le code, ca m'aide à voir plus clair :

    Dans ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        public void createPartControl(Composite parent) {
     
            RowLayout loParent = new RowLayout(SWT.VERTICAL);
            loParent.fill = true;
            loParent.justify = true;
            parent.setLayout(loParent);
            GridData loDataParent = new GridData(SWT.FILL, SWT.FILL, true, true);
            loDataParent.minimumHeight = 200;
            loDataParent.minimumWidth = 200;
            loDataParent.heightHint = 200;
            loDataParent.widthHint = 200;
            parent.setLayoutData(loDataParent);
    ...
    Le griddata loDataparent ne sert à rien sauf si le parent est de type griddata...

    Mon conseil est de ne pas mélanger trop les layouts sinon on se perd un peu les pédales. Ma solution est d'utiliser simplement une grille.

    (Ma solution est à adapter car n'ayant pas tout le code, j'ai dû meubler un peu...) :

    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
     
            {
                // On fait une grille 1 colonne
                parent.setLayout(new GridLayout(1,true));
     
                // Viewer de la table
                Composite cTable = new Composite(parent, SWT.NONE);
     
                // La table prendra tout l'espace du composite
                cTable.setLayout(new FillLayout());
     
                // La table prend tout l'espace possible et peut déborder
                cTable.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
     
     
                // Contenu de la table
                Table t = new Table(cTable, SWT.FULL_SELECTION | SWT.SINGLE | SWT.V_SCROLL | SWT.BORDER);
                new TableColumn(t, SWT.CENTER).setText("Col 0");
                new TableColumn(t, SWT.CENTER).setText("Col 1");
                new TableColumn(t, SWT.CENTER).setText("Col 2");
                new TableColumn(t, SWT.CENTER).setText("Col 3");
                TableColumn tableColumn = new TableColumn(t, SWT.CENTER);
                tableColumn.setText("Col 4");
                t.setHeaderVisible(true);
                t.setLinesVisible(true);
     
                // Données affichées
                for (int i=0; i<12; i++) {
                    TableItem item = new TableItem (t, 0);
                    item.setText ("Item " + i);
                }
     
     
                // Taille auto
                for (int i = 0, n = t.getColumnCount(); i < n; i++) {
                    t.getColumn(i).pack();
                }
                t.pack(true);
     
                // zone des boutons
                Composite cButtons = new Composite(parent, SWT.NONE);
     
     
                // Les boutons peuvent déborder en largeur, pas en hauteur
                cButtons.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));
     
                RowLayout loButtons = new RowLayout(SWT.HORIZONTAL);
                loButtons.pack = false;
                loButtons.justify = true;
                cButtons.setLayout(loButtons);
     
                // bouton fiche
                Button fiche = new Button(cButtons, SWT.PUSH | SWT.CENTER);
                fiche.setText("Fiche");
                // Bouton quitter
                Button quitter = new Button(cButtons, SWT.PUSH);
                quitter.setText("Quitter");
                cButtons.layout();
     
                // Affichage
                parent.pack();
            }
    J'espère que ca marche,

    Laurent

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 18
    Par défaut
    Citation Envoyé par meddle Voir le message
    Salut,
    Mon conseil est de ne pas mélanger trop les layouts sinon on se perd un peu les pédales. Ma solution est d'utiliser simplement une grille.

    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
     
                // La table prendra tout l'espace du composite
                cTable.setLayout(new FillLayout());
     
                // La table prend tout l'espace possible et peut déborder
                cTable.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
     
     
                // Les boutons peuvent déborder en largeur, pas en hauteur
                cButtons.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));
     
                RowLayout loButtons = new RowLayout(SWT.HORIZONTAL);
                loButtons.pack = false;
                loButtons.justify = true;
                cButtons.setLayout(loButtons);
    J'espère que ca marche,

    Laurent


    Effectivement les layouts ne sont pas tous compatibles

    On ne peut pas mettre de GridData sur un FillLayout ni sur un RowLayout ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.ClassCastException: org.eclipse.swt.layout.GridData cannot be cast to org.eclipse.swt.layout.FillData
    En fait avant de poster, j'ai fais de nombreux essais et le code que tu peux lire garde quelques traces de mes essais

    Mais je peux simplifier et tout mettre pour les besoins :
    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
     
    public class TableView extends ViewPart {
     
    	public static final String ID = "RCPDemo.tableView";
     
    	private static final SimpleDateFormat SDF = new SimpleDateFormat("dd/MM/yyyy", Locale.FRANCE);
    	private static final String[] colonnes = { "N°", "Nom"};
     
    	private List<Personne> personnes = new ArrayList<Personne>();
    	private TableViewer tViewer;
     
    	class ViewContentProvider implements IStructuredContentProvider {
    		public Object[] getElements(Object input) {
    			return personnes.toArray();
    		}
    		public void dispose() {}
    		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
    	}
     
    	class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
    		public String getColumnText(Object obj, int index) {
    			Personne p = (Personne) obj;
    			switch (index) {
    			case 0:
    				return p.getNumero().toString();
    			case 1:
    				return p.getNom();
    			}
    			return null;
    		}
    		public Image getColumnImage(Object obj, int index) {
    			return null;
    		}
    		public boolean isLabelProperty(Object element, String property) {
    			return false;
    		}
    	}
     
    	public void createPartControl(Composite parent) {
     
    		// RowLayout avec fill pour avoir cTable et cButtons de la même largeur  
    		RowLayout loParent = new RowLayout(SWT.VERTICAL);
    		loParent.fill = true;
    		parent.setLayout(loParent);
     
    		// Conteneur de la table
    		Composite cTable = new Composite(parent, SWT.NONE);
     
    		// GridLayout obligatoire pour GridData
    		cTable.setLayout(new GridLayout(1, false));
     
    		// Création du viewer RAS
    		tViewer = new TableViewer(cTable, SWT.FULL_SELECTION | SWT.SINGLE | SWT.V_SCROLL | SWT.BORDER);
    		tViewer.setContentProvider(new ViewContentProvider());
    		tViewer.setLabelProvider(new ViewLabelProvider());
    		tViewer.setInput(personnes);
     
    		// Gestion de la table : FILL, GRAB, CENTER, noms des colonnes, affichage
    		Table table = tViewer.getTable();
    		table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    		new TableColumn(table, SWT.CENTER).setText(colonnes[0]);
    		new TableColumn(table, SWT.CENTER).setText(colonnes[1]);
    		table.setHeaderVisible(true);
    		table.setLinesVisible(true);
     
    		// Données contenues dans la table
    		try {
    			personnes.add(new Personne(new Integer(1), "Martin", "Jacques", SDF.parse("10/10/1950"), new Boolean(false)));
    		} catch (ParseException e) {
    			e.printStackTrace();
    		}
    		tViewer.refresh();
     
    		// Conteneur des boutons : justify pour disposition des boutons plus mieux 
    		Composite cButtons = new Composite(parent, SWT.NONE);
    		RowLayout loButtons = new RowLayout(SWT.HORIZONTAL);
    		loButtons.justify = true;
    		cButtons.setLayout(loButtons);
    		// bouton fiche RAS
    		Button fiche = new Button(cButtons, SWT.PUSH | SWT.CENTER);
    		fiche.setText("Fiche");
    		// Bouton quitter RAS
    		Button quitter = new Button(cButtons, SWT.PUSH);
    		quitter.setText("Quitter");
     
    		// Affichage : Packing des tous les objets
    		for (int i = 0, n = table.getColumnCount(); i < n; i++) {
    			table.getColumn(i).pack();
    		}
    		table.pack();
    		cButtons.pack();
    		parent.pack();
    		parent.getShell().pack(); // Et là c'est le drame : fenêtre rikiki ...
    	}
     
    	public void setFocus() {
    		tViewer.getControl().setFocus();
    	}
    }
    Le problème a l'air d'être en amont de 'parent', la taille de tous les éléments (Composites + enfants) sont de la bonne taille (test de coloration du fond) ...

    Pour info voici les images de ma fenêtre avec et sans le shell.pack() :




Discussions similaires

  1. [SWT] Shell problem
    Par cha3labou dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 30/04/2009, 16h03
  2. [SWT] Shell sans boutons
    Par FranT dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 02/08/2006, 14h27
  3. [SWT] SWT shell et composite
    Par Rocket dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 26/03/2006, 12h08
  4. [ALGORITHME] a propos du bin packing
    Par barbot dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 05/01/2004, 23h27
  5. Qu'est-ce que Packed Record ?
    Par - Robby - dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2003, 11h39

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