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 03/08/2012, 13h29   #1
pingoui
Membre habitué
 
Avatar de pingoui
 
Inscription : juillet 2004
Messages : 534
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : juillet 2004
Messages : 534
Points : 129
Points : 129
Par défaut Taille d'un canvas

Bonjour,

Je suis en train de réaliser un agenda. J'ai une cellule (composite) contenant une ou plusieurs tâches (Canvas).

Ma Tâche (Canvas) ne prend pas la totalité de la taille de la cellule (composite)
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
 
 
public class PlanningTask extends Canvas{
 
	private static final int TASK_HEIGHT = 20;
	private static final int TASK_TEXT_FONT_HEIGHT = 10;
 
	public PlanningTask(final Composite parent, int style) {
		super(parent, style);
		addCanvasListener();
		System.out.println("width parent " + parent.getSize().x);
		this.setSize(parent.getSize().x, parent.getSize().y);
	}
 
 
	/**
	 * Ajoute un listener 
	 * 
	 */
	private void addCanvasListener() {
		// ajoute un listener qui écoute les modifications sur le planning
		this.addPaintListener(new PaintListener() {
			public void paintControl(final PaintEvent event) {
				PlanningTask.this.paint(event.gc);
			}
		});
	}
 
	/* Paint function */
	private void paint(GC gc) {
		System.out.println("width image in paint méthode " + getSize().x);
        Image image = (Image) getData("double-buffer-image");
        if (image == null || image.getBounds().width != getSize().x || image.getBounds().height != getSize().y) {	
        	image = new Image(getDisplay(),getSize().x,getSize().y);
        	setData("double-buffer-image", image);
        }
        GC imageGC = new GC(image);       
		imageGC.setAntialias(SWT.ON);
		paintTask(imageGC);
		gc.drawImage(image, 0, 0);
		imageGC.dispose();
		gc.dispose();
	}
 
	/**
	 * <p>
	 * Paint the planning.
	 * </p>
	 * 
	 */
	private void paintTask(GC gc) {		
 
	      Color color = this.getDisplay().getSystemColor(
					SWT.COLOR_YELLOW);
	      gc.setForeground(this.getDisplay().getSystemColor(
					SWT.COLOR_BLACK));
	      gc.setBackground(color);
	      Font font = new Font(this.getDisplay(), "Arial",TASK_TEXT_FONT_HEIGHT,SWT.BOLD);
 
	      int x = this.getBounds().x;
	      int y = this.getBounds().y;
	      int width = this.getSize().x;
	      System.out.println("width "+width);
	      int height = TASK_HEIGHT;
 
	      gc.drawRoundRectangle( x,y,width,height,10,10);
	      gc.fillRoundRectangle(x+1,y+1,width-1, height-1,9,9);
	      gc.setFont(font);
	      Point textSize = gc.textExtent("task");
	      int xText = (int) ((x + width/ 2) - (textSize.x / 2));
	      int yText = (int) ((y + 25 / 2) - (textSize.y / 2));
	      gc.drawText("task", xText, yText);
 
	      gc.dispose();
	}
 
}
J'ai mis des sortie ver la console dans le constructeur et la méthode paint. Je ne comprend pas pourquoi la méthode getSize() retourne deux valeurs différentes

Code :
1
2
3
4
 
width parent 250
width image in paint méthode 64
width 64
Cordialement
pingoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2012, 13h51   #2
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 564
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 564
Points : 3 421
Points : 3 421
Salut,

Je te conseillerai plutôt de mettre la taille que tu souhaites obtenir sur la donnée de layout de ton composant plutôt que sur le composant lui-même. C'est cette donnée qui prendra le pas sur les informations de tailles.
Donc, si tu as un GridData, tu fais un petit:
Code :
1
2
gridData.widthHint = parent.getSize().x;
gridData.heightHint = parent.getSize().y;
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 03/08/2012, 22h38   #3
pingoui
Membre habitué
 
Avatar de pingoui
 
Inscription : juillet 2004
Messages : 534
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : juillet 2004
Messages : 534
Points : 129
Points : 129
Salut Gueritarish,

Malgré le griData, j'ai toujours ce dysfonctionnement.
Mon composant ne prend pas toutes la place de son conteneur

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
	public PlanningTask(final Composite parent, int style) {
		super(parent, style);
		addCanvasListener();
		System.out.println("width parent " + parent.getSize().x);
		GridData gridData = new GridData();
        gridData.horizontalAlignment = GridData.FILL;
        gridData.grabExcessHorizontalSpace = true;
        gridData.widthHint = parent.getSize().x;
        gridData.heightHint = parent.getSize().y;
        this.setLayoutData(gridData);
	}
@+
pingoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/08/2012, 11h50   #4
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 564
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 564
Points : 3 421
Points : 3 421
Salut,

Si tu veux qu'il occupe toute la place du composant, as-tu pensé à créer un gridData qui s'agrandit : new GridData(SWT.FILL, SWT.FILL, true, true);? J'imagine que oui, mais bon, ça vaut toujours le coup de demander

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 12/12/2012, 20h02   #5
pingoui
Membre habitué
 
Avatar de pingoui
 
Inscription : juillet 2004
Messages : 534
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : juillet 2004
Messages : 534
Points : 129
Points : 129
Salut Gueritarish,

J'y est pensé sauf que cela ne change bizarrement rien

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
	public PlanningTask(final Composite parent, int style) {
		super(parent, style);
		addCanvasListener();
		System.out.println("width parent " + parent.getSize().x);
		this.setSize(parent.getSize().x, parent.getSize().y);
		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
        gridData.horizontalAlignment = GridData.FILL;
        gridData.grabExcessHorizontalSpace = true;
        gridData.widthHint = parent.getSize().x;
        gridData.heightHint = parent.getSize().y;
        this.setLayoutData(gridData);
	}
Cordialement
pingoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 09h25   #6
GouiTPT
Invité régulier
 
Homme
Ingénieur en apprentissage
Inscription : août 2012
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Ingénieur en apprentissage
Secteur : Industrie

Informations forums :
Inscription : août 2012
Messages : 12
Points : 8
Points : 8
Bonjour,

Un ptit conseil, quand j'ai un problème d'IHM je fais appel à WindowBuilder pro qui est un plug-in Eclipse qui génère le code de l'IHM que tu construis en drag'n drop. C'est très pratique pour voir ce que tu fais de mal.
Voici le lien pour la liste des download sites :
http://www.eclipse.org/windowbuilder/download.php

PS :
Code :
GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
veut dire :
Code :
1
2
3
4
gridData.horizontalAlignment = SWT.FILL;
gridData.grabExcessHorizontalSpace = true;
gridData.verticalAlignment = SWT.FILL;
gridData.grabExcessVericalSpace = true;
donc inutile de mettre les 2 lignes après l'instanciation de ton GridData
GouiTPT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2012, 19h11   #7
pingoui
Membre habitué
 
Avatar de pingoui
 
Inscription : juillet 2004
Messages : 534
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : juillet 2004
Messages : 534
Points : 129
Points : 129
Bonsoir,

Merci pour ton conseil pour WindowBuilder, mais je suis assez partisan de coder mon IHM à la main. Surtout que je ne sais pas si WindowBuilder gère les souscomposants multiples

Mon Canvas PlanningTask est une tâche contenue dans une case de planning (Composite parent) etc....

Et je souhaites comprendre sur cet exemple simple où se trouve mon erreur afin de progresser.

Je suis bien au fait que le code ci-dessous est inutile... mais étant bloqué je teste toutes les solutions
Code :
1
2
 
GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
Cordialement
pingoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 13h57   #8
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 564
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 564
Points : 3 421
Points : 3 421
Salut,

Si tu peux, essaie de poster une version executable de ton code. Histoire qu'on puisse y jeter un oeil... Si tu peux pas, bon courage

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 14/12/2012, 23h09   #9
pingoui
Membre habitué
 
Avatar de pingoui
 
Inscription : juillet 2004
Messages : 534
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : juillet 2004
Messages : 534
Points : 129
Points : 129
Je peux le faire

Ci-joint une mini application RCP avec mon planning.
POur voir le résultat, il faut double cliquer dans une case du planning

http://dl.free.fr/hMknQkvgj

La classe où se trouve le dysfonctionnement est org.planning.ui.domain.PlanningTask

Cordialement
pingoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 11h52   #10
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 564
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 564
Points : 3 421
Points : 3 421
Salut,

Alors je suis loin d'avoir regardé tout ton code (même si c'est une version light?)
Cependant, j'ai trouvé la source de ton problème. Dans ta méthode addTask() dans la classe PlanningCell, tu fais un task.pack();. Mauvaise idée. Tu supprimes ce pack() et tout rentre dans l'ordre.
Au passage, passe plutôt SWT.NONE que SWT.NULL (même si au final, ça revient à passer 0, la sémantique n'est pas tout à fait la même).
Petite correction aussi, dans la classe PlanningTask, dans ta méthode paintTask() le rectangle est un peu "grand", essaie plutôt:
Code :
1
2
gc.drawRoundRectangle(x, y, width - 5, height, 10, 10);
gc.fillRoundRectangle(x + 1, y + 1, width - 6, height - 1, 9, 9);
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 17/12/2012, 13h24   #11
pingoui
Membre habitué
 
Avatar de pingoui
 
Inscription : juillet 2004
Messages : 534
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : juillet 2004
Messages : 534
Points : 129
Points : 129
Parfait Merci beaucoup ! Ca marche

Pour ma culture, Pourquoi faire un pack() est une mauvaise ?

Cordialement
pingoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 14h24   #12
Gueritarish
Modérateur
 
Avatar de Gueritarish
 
Homme Marc
Développeur Java
Inscription : mai 2007
Messages : 1 564
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 564
Points : 3 421
Points : 3 421
En fait, faire un pack() en soit, n'est pas une mauvaise idée. C'est juste que, dans ton cas, j'ai trouvé ça un peu hasardeux.
En fait, cette méthode va appliquer la taille préféré au composant. Dans le cas d'un Composite, elle va retailler les enfants de celui-ci à leur taille préféré. Quand elle n'est pas renseigné, pour un bouton par exemple, la taille va être celle du texte qu'il contient.

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 17/12/2012, 19h21   #13
pingoui
Membre habitué
 
Avatar de pingoui
 
Inscription : juillet 2004
Messages : 534
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : juillet 2004
Messages : 534
Points : 129
Points : 129
Ok merci pour les explications
pingoui 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 04h30.


 
 
 
 
Partenaires

Hébergement Web