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 :

Pb de layout, ajout dynamique de composant dans une Section dans un ScrollingComposite


Sujet :

SWT/JFace Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 22
    Points : 10
    Points
    10
    Par défaut Pb de layout, ajout dynamique de composant dans une Section dans un ScrollingComposite
    Bonjour

    Voila, je me demande si c'est un bug...
    J'ai un layout un peu compliqué qui semble buggé quand j'utilise une section,
    Une idée ?

    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.custom.ScrolledComposite;
    import org.eclipse.swt.events.PaintEvent;
    import org.eclipse.swt.events.PaintListener;
    import org.eclipse.swt.events.SelectionEvent;
    import org.eclipse.swt.events.SelectionListener;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.layout.RowLayout;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Group;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.ui.forms.widgets.Section;
    import org.eclipse.swt.widgets.Shell;
    import org.eclipse.ui.forms.widgets.FormToolkit;
     
    public class TestLayout {
    	static int i = 0;
    	private static FormToolkit toolkit;
    	private static ScrolledComposite sc;
     
    	public static void main(String[] args) {
    		Display display = new Display();
    		final Shell shell = new Shell(display);
    		shell.setLayout(new GridLayout());
     
    		Composite mainComposite = new Composite(shell, SWT.BORDER);
    		mainComposite.setLayout(new GridLayout());
    		mainComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
     
    		sc = new ScrolledComposite(mainComposite, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
    		sc.setExpandHorizontal(true);
    		sc.setExpandVertical(true);
    		sc.setLayoutData(new GridData(GridData.FILL_BOTH));
    		sc.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
     
    		sc.getVerticalBar().setIncrement(sc.getVerticalBar().getIncrement() * 9);
     
    		final Composite contentComposite = new Composite(sc, SWT.BORDER);
    		contentComposite.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
    		contentComposite.setBackgroundMode(SWT.INHERIT_FORCE);
    		contentComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    		contentComposite.setLayout(new GridLayout());
    		contentComposite.setBackground(display.getSystemColor(SWT.COLOR_GRAY));
    		sc.setContent(contentComposite);
     
    		contentComposite.addPaintListener(new PaintListener() {
     
    			@Override
    			public void paintControl(PaintEvent e) {
    				sc.setMinHeight(contentComposite.computeSize(contentComposite.getSize().x, SWT.DEFAULT).y);
    			}
    		});
     
    		Label lbl = new Label(contentComposite, SWT.NONE);
    		lbl.setText("ContentComposite");
     
    		toolkit = new FormToolkit(display);
    		addSection(contentComposite);
    		addSection(contentComposite);
    		addSection(contentComposite);
     
    		shell.setSize(400, 300);
    		shell.open();
    		while (!shell.isDisposed()) {
    			if (!display.readAndDispatch())
    				display.sleep();
    		}
    		toolkit.dispose();
    		display.dispose();
    	}
     
    	private static void addSection(final Composite contentComposite) {
     
    		// *****
    		// Si vous pensez que c'est à cause du toolkit, utilisez cette ligne
    		// *****
    		// final Section section = new Section(contentComposite, Section.DESCRIPTION | Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED |
    		// Section.COMPACT);
     
    		// final Section section = toolkit.createSection(contentComposite, Section.DESCRIPTION | Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED);
    		// section.setText("SECTION");
    		// section.setLayout(new FillLayout());
    		// section.setLayoutData(new GridData(GridData.FILL_BOTH));
     
    		// final Composite sectionContent = new Composite(section, SWT.BORDER);
    		final Composite sectionContent = new Composite(contentComposite, SWT.BORDER); // à commenter
    		sectionContent.setLayout(new GridLayout());
    		sectionContent.setBackground(contentComposite.getDisplay().getSystemColor(SWT.COLOR_WHITE));
    		sectionContent.setBackgroundMode(SWT.INHERIT_NONE);
    		sectionContent.setLayoutData(new GridData(GridData.FILL_BOTH));
    		// section.setClient(sectionContent);
     
    		Label lbl = new Label(sectionContent, SWT.NONE);
    		lbl.setText("SectionContent");
    		Button add = new Button(sectionContent, SWT.PUSH);
    		add.setText("add Element");
     
    		final Group group = new Group(sectionContent, SWT.NONE);
    		group.setLayoutData(new GridData(GridData.FILL_BOTH));
    		RowLayout rowLayout = new RowLayout(SWT.HORIZONTAL);
    		rowLayout.wrap = true;
    		rowLayout.fill = true;
    		rowLayout.pack = false;
    		group.setLayout(rowLayout);
    		group.setText("Elements");
     
    		add.addSelectionListener(new SelectionListener() {
     
    			@Override
    			public void widgetSelected(SelectionEvent e) {
    				Label lbl = new Label(group, SWT.BORDER);
    				lbl.setText("added " + i++);
    				sc.layout(true, true);
    			}
     
    			@Override
    			public void widgetDefaultSelected(SelectionEvent e) {
    			}
    		});
     
    		// for (int ind = 0; ind < 10; ind++) {
    		// lbl = new Label(group, SWT.BORDER);
    		// System.out.println("adding button " + i);
    		// lbl.setText("added " + i++);
    		// }
     
    	}
    }
    Vous pouvez tester le code tel quel il fait bien ce qu'il doit faire lorsque la fenêtre est resizée.
    Ensuite Commentez la ligne marquée
    Décommentez les autres et la c'est le drame ...
    La section ne se redimensionne pas verticalement alors qu'elle est en FILL_BOTH...
    Elle ne prend qu'une seule ligne (probablement a cause du RowLayout)

    Si vous avez une solution ou si vous pensez que c'est un bug merci de me répondre
    A+

  2. #2
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut
    Bonjour,
    je n'ai pas testé le code mais si tu utilises plutôt ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GridDataFactory.fillDefaults().grab(true, true).applyTo(sectionContent);
    au lieu de ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ...setLayoutData(new GridData(GridData.FILL_BOTH));
    tu as toujours le problème ?

    jojodu31
    Heureux soient les fêlés, car ils laisseront passer la lumière.

    Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Ce que tu me dis de faire c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    align(SWT.FILL, SWT.FILL) 
    exclude(false) 
    grab(false, false) 
    hint(SWT.DEFAULT, SWT.DEFAULT) 
    indent(0,0) 
    minSize(1,1) 
    span(1,1) 
    sectionContent.setLayoutData(new GridData(GridData.FILL_BOTH));

    merci quand même.

  4. #4
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut
    Non pas du tout c'est bien ce que j'ai écrit que je te dis de tester, à savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GridDataFactory.fillDefaults().grab(true, true).applyTo(sectionContent);
    c'est surtout le grab(true,true) qui est important afin que ta cellule prenne toute la place possible
    Heureux soient les fêlés, car ils laisseront passer la lumière.

    Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    je crois que t'as pas compris, le code que j'ai collé c'est les sources du code que tu me demandes d'essayer...
    Tu ne sais même pas ce que fait ton code apparemment ...

  6. #6
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut
    Le code que tu as collé ne fait en rien la même chose que ce que j'ai donné Je crois que c'est toi qui n'a pas compris... mais bon courage quand même
    Heureux soient les fêlés, car ils laisseront passer la lumière.

    Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et ne laisser aucun doute à ce sujet.

    Cours et tutoriels pour apprendre Java , FAQ Java, et Forum Java

  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
    Citation Envoyé par izyl_ Voir le message
    je crois que t'as pas compris, le code que j'ai collé c'est les sources du code que tu me demandes d'essayer...
    Tu ne sais même pas ce que fait ton code apparemment ...
    Bon, déjà quand quelqu'un t'aide, même s'il se trompe (ce qui n'est pas le cas ici) il y a des façons plus courtoise de le lui faire remarquer...

    Ensuite, le code de jojodu31 fais exactement ce que tu as besoin qu'il fasse...
    Si ça te paraît trop obscur, essaye plutôt ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
    sectionContent.setLayoutData(data);
    qui est plus correct que ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new GridData(GridData.FILL_BOTH);
    qui est d'ailleurs déconseiller dans la Javadoc (quitte à lire les sources, lit au moins la javadoc...). Pour rappel:
    Citation Envoyé par Javadoc
    Not recommended. Use <code>new GridData(SWT.FILL, SWT.FILL, true, true)</code> instead.
    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/10/2013, 20h15
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [Listview]Ajout Name des controles d'une form dans une listview
    Par Roken62 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 12/01/2009, 13h17
  4. Réponses: 5
    Dernier message: 27/09/2007, 13h39
  5. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13

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