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 :

Taille d'un canvas


Sujet :

SWT/JFace Java

  1. #1
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    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 : 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
     
     
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    width parent 250
    width image in paint méthode 64
    width 64
    Cordialement

  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,

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Salut Gueritarish,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
    	}
    @+

  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
    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.

  5. #5
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Salut Gueritarish,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur en apprentissage
    Inscrit en
    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 : 10
    Points
    10
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
    veut dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
    Cordialement

  8. #8
    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,

    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.

  9. #9
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    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

  10. #10
    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,

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  11. #11
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Parfait Merci beaucoup ! Ca marche

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

    Cordialement

  12. #12
    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
    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.

  13. #13
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Ok merci pour les explications

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

Discussions similaires

  1. Redimensionner image à la taille d'un canvas
    Par Thibault92 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/02/2012, 12h53
  2. Réponses: 2
    Dernier message: 09/02/2010, 18h59
  3. Taille d'un canvas a 100% en AS3
    Par TheDrev dans le forum Flex
    Réponses: 4
    Dernier message: 28/05/2009, 10h10
  4. Définir la taille d'un canvas dans un sizer
    Par Knuckles dans le forum wxPython
    Réponses: 1
    Dernier message: 13/06/2007, 12h27
  5. Adapter un texte à la taille d'un Canvas
    Par alex6891 dans le forum Java ME
    Réponses: 8
    Dernier message: 16/03/2007, 09h21

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