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

AWT/Swing Java Discussion :

Redimensionner tous les composants d'une fenetre


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut Redimensionner tous les composants d'une fenetre
    Bonjour,

    en cherchant sur le forum, j'ai trouvé plusieurs topics traitant de ce sujet, mais malheureusement aucun n'a pu m'aider dans mon problème:

    comment faire pour que lorsque l'on redimensionne une fenêtre, tous les composants se redimensionnent aussi ?

    J'ai une JFrame qui contient 1 JPanel principal qui va lui-même contenir 2 JPanels (ces 2 JPanels sont obtenus par des classes qui dessinent des rectangles), j'utilise un GridLayout à 2 lignes et 1 colonne (1er rectangle issu du 1er JPanel en haut, et l'autre en bas), voici une partie de 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
    /** Classe contenant le code qui gere l'aspect general de la fenetre de l'application **/
    import javax.swing.*;
    import java.awt.*;
     
    public class FenetrePrincipale extends JFrame
    {
    	//Constructeur
    	public FenetrePrincipale()
    	{
    		super();
    		build();	//on initialise la fenetre
    	}
     
    	private void build()
    	{
    		setTitle("Deux rectangles");
    		setSize(800,700);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setContentPane(buildContentPane());
    	}
     
    	private JPanel buildContentPane()
    	{
    		JPanel panneau_princ = new JPanel();
     
    		panneau_princ.setLayout(new GridLayout(2,1));
    		panneau_princ.setBackground(Color.GREEN);
     
    		CamionDeCote panneau1 = new Rectangle1();
    		CamionDeFace panneau2 = new Rectangle2();
     
    		panneau_princ.add(panneau1);
    		panneau_princ.add(panneau2);
     
    		return panneau_princ;
    	}
    }
    Mon problème est que quand j'agrandis ou diminue ma fenêtre, les composants (à savoir les 2 rectangles) gardent les mêmes dimensions...

    Faut-il que je modifie les dimensions de mes rectangles à chaque fois que la JFrame est agrandie (en utillisant componentResized(ComponentEvent e) ) ?

    Pourtant, d'après ce que j'ai lu, l'utilisation d'un gestionnaire de disposition devrait permettre le redimensionnement automatique des composants ?

    Merci d'avance pour votre aide.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut quelques petites précisions
    Re,

    en changeant les couleurs de fonds et les tailles de mes JPanel et en essayant avec un BorderLayout, j'ai l'impression que ce sont mes rectangles (ceux qui sont dessinés dans les JPanel) qui sont "figés" : quand je redimensionne la fenêtre, je vois les JPanel changer (leur dimensions changent), mais par contre les rectangles qui y sont dessinés à l'intérieur ne changent ni de position, ni de dimension...

    Pourtant, je dessine ces rectangles dans des JPanels, et ces JPanels sont bien modifiés eux...

    Si quelqu'un a une idée, elle sera la bienvenue
    Merci d'avance

  3. #3
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Tu dessines ces Rectangle comment ? Les dimensions sont-elles fixes ?
    Pour contrôler le redimensionnement d'un JPanel, tu peux lui ajouter un border rouge par exemple.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Tu dessines ces Rectangle comment ?
    En fait je récupère des données d'un fichier, puis au final j'utilise des ArrayList de Rectangle.
    Pour les dessiner, j'ai fait 2 classes Rectangle1 et Rectangle2 qui étendent JPanel, puis à l'intérieur, j'utilise la méthode paintComponent(Graphics g) : entre autres, je définit une nouvelle origine de repère, et je boucle sur les éléments de la liste, puis je fais g.fillRect, voici ma classe Rectangle1 :

    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
    import javax.swing.*;
    import java.awt.*;
    import java.util.*;
     
    public class Rectangle1 extends JPanel 
    {	
    	public Rectangle1 ()
    	{
    		setSize(new Dimension(700,600));
    		setBackground(Color.cyan);
    		///setMinimumSize(new Dimension(590,240));
    		//setLayout(new BorderLayout());
    	}
     
     
    	public void paintComponent(Graphics g)
    	{
    		super.paintComponent(g);
     
    		try
    		{
    			/** Recuperation et trace du rectangle principal**/
    			Rectangle principal= Recuperation.recupPrincipal("donnees.txt");
     
    			g.setColor(new Color(130,130,130));
    			g.fillRect(0, 0, principal.width, principal.height);
     
    			//Nouvelle origine : coin en bas a gauche du rectangle principal
    			g.translate(0,principal.height);
     
    			/** Pour les autres rectangles, dessinés dans l rectangle principal**/
    			ArrayList<Rectangle> liste = Recuperation.recupAutres("donnees.txt");
     
     
    			//Generation de couleurs 
    			GenereCouleurs coul = new GenereCouleurs(liste.size());
    			Color tab[] = new Color[liste.size()];
    			tab = coul.getTabCouleurs();
     
    			for(int i=0; i<liste.size(); i++)
    			{
    				//Remplissage par la couleur
    				g.setColor(tab[i]);
    				//Les coordonnees correspondant aux coins haut gauche des rectangles -> modifier l'ordonnee au moment de les tracer dans le noueau repere
    				g.fillRect(liste.get(i).x, -(liste.get(i).y + liste.get(i).height), liste.get(i).width, liste.get(i).height);
    			}
     
    		}
     
    		catch(Exception e){
    			System.err.println(e.getMessage());
    		}
     
    	}
    }
    Puis, dans ma classe FenetrePrincipale, j'utilise des objets de ces classes (Rectangle1 et Rectangle2) comme des JPanel...

    Pour contrôler le redimensionnement d'un JPanel, tu peux lui ajouter un border rouge par exemple.
    J'ai rajouté un border dans la classe Rectangle1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import javax.swing.*;
    import java.awt.*;
    import java.util.*;
     
    public class Rectangle1 extends JPanel 
    {	
    	public Rectangle1 ()
    	{
    		setSize(new Dimension(700,600));
    		setBackground(Color.cyan);
                    this.setBorder(BorderFactory.createEtchedBorder(Color.RED, Color.YELLOW));
    		///setMinimumSize(new Dimension(590,240));
    		//setLayout(new BorderLayout());
    	}
    et la liste des rectangles est dessinée au-dessus du cadre du border ! (normalement, le border devrait entourer le JPanel tout entier, et donc les rectangles, non?)
    Et quand je redimensionne, le border est automatiquement redimensionné, mais pas les rectangles.

    Le problème doit venir dans la façon de dessiner mes rectangles dans le JPanel (vu que j'utilise des coordonnées et puis un nouveau repère...).
    Mais je ne sais pas comment faire autrement pour les dessiner correctement les uns par rapports aux autres...

    Quelqu'un a une idée ?
    Merci d'avance

  5. #5
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Tu dessines tes rectangles en utilisant leurs dimensions, tu as beau redimensionner ton écran, les données, elles, ne changent pas, donc tes rectangles sont dessinés aux mêmes dimensions.

    Dans ce que je vois tu ne te sers à aucun moment des dimensions de ta fenêtre pour dessiner tes rectangles, ils ne seront jamais plus grand.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Merci natha pour ta contribution à mon problème,

    Dans ce que je vois tu ne te sers à aucun moment des dimensions de ta fenêtre pour dessiner tes rectangles, ils ne seront jamais plus grand.
    J'ai essayé de trouver un moyen de calcul en utilisant getWidth() et getHeight() qui me donnent les dimensions de mon panel.
    J'ai voulu essayer de calculer un coeff d'agrandissement ou de rétrecissement compris entre 0 et 1 en faisant :

    coeff_x = getWidth_initial / getWidth()
    coeff_y = getHeight_initial / getHeight()

    où getWidth_initial (resp. getHeight_initial) correspond à la largeur (resp. hauteur) initiale du panel,
    et puis je voulais multiplier toutes les dimensions des rectangles par ce coeff, mais je n'avais pas pensé que ce coeff n'était pas entier !!!

    Mais alors quel calcul permet d'obtenir un nombre que je multiplierai aux dimensions des rectangles, tout en ayant des int ?

    Merci d'avance

  7. #7
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Garde ton coef en float, et quand tu calcules le largeur et hauteur de dessin, caste les résultats de calculs en int.

    float coef = widthInit / width;
    int widthDessin = (int) (widthRectangle * coef).

    Ca suffira je pense.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    float coef = widthInit / width;
    int widthDessin = (int) (widthRectangle * coef).

    Ca suffira je pense.
    Effectivement ça marche !!!!
    Merci natha

    J'ai encore une question : comment faire pour obtenir les dimensions initiales du panel (pour tester j'ai un peu triché, j'ai affiché getWidth() et getHeight() et j'ai utilisé les valeurs que je trouvais)
    Si je fais float x = getWidth(), la variable x est changée dès que getWidth() change (je crois que c'est à cause des références n'est-ce pas?)

    Bref, comment faire pour garder la valeur initiale dans x ?
    Merci d'avance.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    comment faire pour obtenir les dimensions initiales du panel (pour tester j'ai un peu triché, j'ai affiché getWidth() et getHeight() et j'ai utilisé les valeurs que je trouvais)
    J'ai trouvé, tout simplement rajouter widthInitial = getWidth() et heightInitial = getHeight(), après avoir fait setSize(new Dimension(700,500)) dans le constructeur (et non pas dans la méthode paintComponent comme je le faisais avant !)

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

Discussions similaires

  1. Meilleur methode pour repartir les composants d'une fenetre
    Par miss_java dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 15/04/2008, 12h10
  2. Réponses: 2
    Dernier message: 06/06/2006, 08h32
  3. [C#][Débutant] Tous les composants de ma fenetre ont disparus : aide svp
    Par Cazaux-Moutou-Philippe dans le forum Windows Forms
    Réponses: 4
    Dernier message: 30/04/2006, 16h22
  4. Comment lister tous les composants d'une fiche ?
    Par tipiweb dans le forum Langage
    Réponses: 2
    Dernier message: 18/01/2006, 21h53
  5. Envoie d'un message a TOUS les composant d'une form
    Par chddv dans le forum Composants VCL
    Réponses: 7
    Dernier message: 15/09/2003, 09h47

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