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

Agents de placement/Fenêtres Java Discussion :

Taille d'un GridLayout


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut Taille d'un GridLayout
    Bonjour,

    J'aimerai savoir s'il est possible de connaitre la taille que va prendre chaque element d'un GridLayout! Avant même d'y avoir ajouté un objet graphique!

    Merci

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    bah avec un GridLayout, tous les composants ont exactement les mêmes dimensions.

    afin de pouvoir déterminer la taille des composants contenus dans un GridLayout, il faut connaitre le nombre de lignes + le nombre de colonnes, ainsi que la dimension du container parent. Si tu as ces infos, c'est bon, sinon c'est impossible. Après, c'est une bête histoire de math (largeurDeChaqueComposant = largeurTotale / nombreDeColonnes, et hauteurDeChaqueComposant = hauteurTotale / nombreDeLignes)


    Bon courage

    PS: je me demande quand même un peu à quoi ça peut servir de connaitre ces valeurs. Tu ne dois normallement pas influencer la taille des composants toi-même, c'est justement le LayoutManager qui s'en occupe

  3. #3
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    Merci de ta reponse mais en fait je me suis trompé dans ma question!
    Pour un GridLayout cela semble assez simple mais comment faire avec un BorderLayout????

    Merci

  4. #4
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    ah !

    avec un Border, le principe est le suivant:

    Les composants placés au NORTH, SOUTH, EAST et WEST auront soit la taille la plus petite possible (si tu ne spécifie rien), soit les dimensions que tu donne avec la méthode setPreferredSize(). Mais rien ne garantit que les composant auront vraiment la taille que tu leur a donnée. Si par exemple le container parent est trop petit pour pouvoir donner les tailles préférées à tous les composants, alors ce sera le BorderLayout qui leur fixera une taille de manière arbitraire.

    Quand au composant placé au CENTER, il occupera toute la place laissée libre.

    Mais si le NORTH/SOUTH/EAST ou WEST sont vides, alors leurs tailles seront égales à 0. Donc, impossible de prévoir la taille avant d'avoir fini d'ajouter tous les composants (et peut-être même avant d'afficher le résultat à l'écran).

    D'après moi, je pense que c'est après l'appel aux méthodes validate et/ou revalidate que les composants ont leur taille fixée. Heureusement, ces méthodes sont invoquées (la plupart du temps) automatiquement par Java.

    (A confirmer ou infirmer)


  5. #5
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    Ceci n'est pas une bonne nouvelle mais bon on fera avec!

    En fait le problème c'est que j'utilise un BorderLayout! Sur la zone North?East,South,West j'ai mis un label vide afin de faire un genre de bordure!!!

    Au centre j'ai un genre de damier (gerer grâce à un GridLayout) sur lequel il y a des Panels affichant chacun des images!

    Le problème est que l'image ne rentre pas en entière dans les panels, du coup j'utilise la fonction getSacledInstance pour essayer de faire en sorte que l'image entre comme il faut dans le Palen! Mais je n'y arrive pas!

    Peut être vous auriez une solution pour automatiser ceci???

  6. #6
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    le problème exact c'est quoi ?

    l'utilisation de la méthode getScaledInstance ? ou alors plutôt un truc lié aux Layout ?

    passe-moi un bout de code si des fois, c'est toujours plus clair que de longs discours

  7. #7
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    En fait ce que je veux faire c'est ajuster l'image au panel! Pour cela j'utilise cette méthode! Mais je ne saisie pas trop bien comment l'utiliser??

  8. #8
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    ok !

    alors je te fais vite une petite explication (t'as de la chance je suis dans un bon jour )

    getScaledInstance, c'est une méthode non-static de la classe java.awt.Image. Tu dois donc l'appliquer sur un objet de type 'Image' ou n'importe quelle classe dérivée. En regardant la signature de la méthode,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public Image getScaledInstance(int width,
                                   int height,
                                   int hints)
    on remarque que cette méthode renvoie un objet... de type Image :o ça tombe droit bien tu me diras... et moi je te répond oui !

    ensuite, les paramètres à donner sont 3 variables de type 'int':
    • le premier, c'est la largeur de l'image que tu veux (en pixels)
      le deuxième, c'est la hauteur
      ... et le troisième ? c'est juste un paramètre qui te permet de choisir le type d'algorithme qui sera utilisé pour redimensionner l'image (selon les cas, il peut être pratique d'utiliser un algo plutôt rapide et qui fait une image un peu moins belle ou alors le contraire). Le troisième paramètre peut donc prendre l'une des valeurs suivantes:


    • Image.SCALE_DEFAULT
      Image.SCALE_FAST
      Image.SCALE_SMOOTH
      Image.SCALE_REPLICATE
      Image.SCALE_AREA_AVERAGING


    bon je vais pas détailler chacune de ces valeurs, c'est pas la peine (et puis surtout je trouve les noms de ces constantes suffisament parlants). Si tu veux plus de détails, tu peux toujours consulter la javadoc: http://javasearch.developpez.com/j2s...awt/Image.html

    donc, on se retrouve généralement avec un code comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // image de base
    Image img = ...; // peu importe comment tu la récupères
     
    // image redimensionnée
    img = img.getScaledInstance(100, 200, Image.SCALE_FAST); // tout simplement
    et voilu, c'est simple non ?

    la dernière astuce à savoir, c'est par exemple si tu veux une largeur fixée (disons 100px) et que tu as envie de conserver les proportions (rapport hauteur/largeur), il suffit de passer un nombre négatif à l'autre argument. La méthode getScaledInstance calculera toute seule la valeur à utiliser afin de conserver le ratio. (ça donne ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // image de base
    Image img = ...;
     
    // image redimensionnée
    img = img.getScaledInstance(100, -1, Image.SCALE_FAST);
    et voili

    bon évidemment il ne faut pas mettre de nombre négatif à la fois pour la largeur et la hauteur

    en espérant répondre à tes questions,

    @+

  9. #9
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    Merci de ta reponse,

    Cela me semble plus clair cependant les valeurs 100,200 ou 100,-1 bont varier selon la resolution de l'écran ou encore le nombre d'élément dans mon GridLayout disposé au centre du BorderLayout!

    Je ne sais pas si tu me suis toujours!

    Bref, pour que la programmation soit propre il faudrait que je puisse avoir 2variables qui contienent précisemment la longueur et la largeur d'un emplacement dans le GridLayout!

    Je te montre mon code!

    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
     
    //Class qui affiche une image sur un JPanel
    class Panneau extends JPanel 
    {
    	private Image image; 
    	private String urlImage;
     
    	public Panneau(String url) 
    	{
    	URL urlImage = getClass().getResource(url); 
    	image = Toolkit.getDefaultToolkit().getImage(urlImage).getScaledInstance(90,-1,Image.SCALE_FAST); 
    	}
     
    	public void paint(Graphics g)
    	{
    	super.paint(g);
    		if(image!=null)
    		g.drawImage(image, 0, 0, this); 		
    	}
    }
     
    //class qui permet d'afficher une multitudes de cases avec chacune leur images
     
    public class Labirynthe extends JPanel
    {
     
    	// Le tableau de cases
    	private Panneau[][] cases;
     
    	public Labirynthe(int clo , int cla)
    	{
    	int i,j;
     
    	this.setLayout(new GridLayout(clo,cla));
    	this.cases = new Panneau[clo][cla];
     
    		for(i = 0 ; i <clo ; i++)
    		{
    			for(j=0 ; j < cla ; j++)
    			{
    				if ((i+j)%2==0)
    				    this.cases[i][j] = new Panneau("pacman2.jpg");						
    				else this.cases[i][j] = new Panneau("pacman2.jpg");
    			this.add(this.cases[i][j]);
    			}
    		}
    	}
    }
     
    //class qui contient la fe^nêtre avec le BorderLyout
    public class Fenetre extends Frame
    {
    private int hauteurEcran,largeurEcran,hauteurFenetre,largeurFenetre;
    private Labirynthe labirynthe;
    private Toolkit tk;
    private Dimension dimEcran;
     
    fenetreEcouteur fenetreEcouteur;
     
    	public Fenetre(String titre)
    	{
    	super(titre);
     
    	//------gestion des evenements de la fenetre------
    	fenetreEcouteur = new fenetreEcouteur(this);	
     
    	// Ajout de la bordure 
    	this.setBackground(Color.green);
    	Label labelNord = new Label(" ");
    	this.add(labelNord, BorderLayout.NORTH);
    	Label labelEst = new Label(" ");
    	this.add(labelEst, BorderLayout.EAST);
    	Label labelSud = new Label(" ");
    	this.add(labelSud, BorderLayout.SOUTH);
    	Label labelOuest = new Label(" ");
    	this.add(labelOuest, BorderLayout.WEST);
     
    	//ajout du labirynthe
    	this.labirynthe = new Labirynthe(10,10);
    	this.add(this.labirynthe, BorderLayout.CENTER);	
     
    	this.place();
    	}	
     
    	public void place()
    	{
     
    	//--------Gestion de la taille de l'écran------
     
    	int origineX, origineY;
     
    	// Taille : 3/4 de l'écran
    	hauteurEcran = getHauteurEcran();
    	largeurEcran = getLargeurEcran();
    	hauteurFenetre = ( 3 * hauteurEcran)/4; 
    	largeurFenetre = (3 * largeurEcran)/4;
     
    	// Placement : à 10% du bord
    	origineX = largeurEcran/10; 
    	origineY = hauteurEcran/10;
     
    	this.setLocation(origineX,origineY);	
    	this.setSize(largeurFenetre, hauteurFenetre);
     
    	}
     
    	public int getHauteurEcran()
    	{
    	tk = Toolkit.getDefaultToolkit();
    	dimEcran = tk.getScreenSize();	
    	return (int)(dimEcran.getHeight());	
    	}
     
    	public int getLargeurEcran()
    	{
    	tk = Toolkit.getDefaultToolkit();
    	dimEcran = tk.getScreenSize();
    	return (int)(dimEcran.getWidth());
    	}	
    }
    Voila donc si tu as compris ce que je voulais faire peut être tu pourras m'aider!!!

    merci

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

Discussions similaires

  1. Taille colonne GridLayout
    Par Grulf dans le forum Agents de placement/Fenêtres
    Réponses: 11
    Dernier message: 11/07/2008, 11h31
  2. Composite différentes taille dans un GridLayout
    Par kitue dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 20/06/2008, 11h18
  3. ajuster la taille d'un composant dans un GridLayout
    Par mouss4rs dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 07/06/2008, 01h58
  4. [débutant] taille button avec GridLayout
    Par cyrill.gremaud dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 03/11/2006, 15h59
  5. Problème de taille d'un JPanel dans un GridLayout
    Par ZamZam340 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 30/04/2006, 20h56

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