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

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    juin 2015
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : juin 2015
    Messages : 146
    Points : 44
    Points
    44
    Par défaut Récupérer la taille utile ou la taille des bordures d'une JFrame
    Bonjour à tous !

    Je me suis aperçu il y a quelques temps déjà que la dimension que l'on attribue à une JFrame c'est en fait la dimension totale de la fenêtre, barre de titre et bordures comprises.
    Je me suis adapté à celà en retirant quelques pixels à la taille du JPanel contenu dans la JFrame et on n'y voit que du feu. Mais bon, c'est du bricolage tout ça, ce n'est pas très propre comme façon de faire. Surtout que je me suis aperçu que Windows 10 et Linux Mint ne gèrent pas les fenêtres comme sur mon ordi (je suis sous Windows 7). En effet, ces dernières sont bien plus fines sous W10 ou LM.
    Du coup j'ai cherché un moyen de récupérer la taille "utile" de la fenêtre pour ainsi redimensionner correctement mon JPanel.

    Voilà ce que j'ai fait (dans ma JFrame) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dimension size = getSize(); // ça me retourne "0"
    Insets insets = this.getInsets();
    int x = insets.left; // ça me retourne "0"
    int y = insets.top; // ça me retourne "0"
    int h = getContentPane().getHeight(); // ça me retourne "0"
    int w = getContentPane().getWidth(); // ça me retourne "0"
    int a = getHeight(); // ça me retourne la hauteur totale de la fenêtre donc pas intéressant.
    int b = getWidth(); // ça me retourne la largeur totale de la fenêtre donc pas intéressant.
    Ensuite j'ai ajouté "this.pack();" avant le code précédemment cité. Là j'ai récupéré des valeurs que je suppose être les valeurs des bordures (pour x et y). Donc c'est parfait ! (ou pas)
    Sauf que ça me foire mon affichage...
    La fenêtre n'est plus aux dimensions que j'avais défini. Elle est tronquée en bas et les éléments de mes différents panels ont été placés sur la droite mais ils ne rentrent pas tous dans la fenêtre. Enfin c'est le bordel.

    Du coup, existe-t-il un moyen autre de récupérer la taille utile ou la taille des bordures de la fenêtre ?

    Je précise que ma fenêtre est construite de cette façon (ça peut expliquer le bug avec "pack()") : 1 JFrame ayant 1 JPanel comme contentpane et ce dernier m'affiche une image de fond. Il contient lui-même 3 JPanel disposés en BorderLayout qui contiennent les différents textes et boutons nécessaires au fonctionnement du programme.

  2. #2
    Nouveau membre du Club Avatar de Aimka_
    Homme Profil pro
    Collégien
    Inscrit en
    octobre 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : octobre 2019
    Messages : 14
    Points : 30
    Points
    30
    Par défaut
    Salut

    Une méthode pour régler ton problème est de prendre la taille du ContentPane ( ce que tu as fait d'ailleurs )
    Dans ton code tu dis que les méthodes te retournent 0 : et pour cause tu n'as pas encore instancié ta JFrame. Du coup le programme qui essaye de chercher quelque chose qui n'existe pas, renvoie 0 . Il faudrait plutôt faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    int h = 0;
    int w = 0;
     
    public Fenetre() { // Le constructeur de ta classe. Moi je l'ai appelée Fenetre
     
        h = this.getContentPane().getWidth();
        y =  this.getContentPane().getHeight();
     
    }

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    juin 2015
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : juin 2015
    Messages : 146
    Points : 44
    Points
    44
    Par défaut
    En fait si, j'ai bien instancié ma JFrame. Voici le code complet de ma JFrame :
    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
    public class LaFrame extends JFrame {
    	private PanGeneral panG = new PanGeneral(); // ça c'est mon JPanel
    	private float pl = 80f;
    	private float ph = 80f;
     
    	int h = 0;
    	int w = 0;
     
    	private static Toolkit t = Toolkit.getDefaultToolkit();
    	private static Dimension d = t.getScreenSize();
     
    	public final static double largeurEcran = d.width;
    	public final static double hauteurEcran = d.height;.
    	private double largeurFenetreDouble = (largeurEcran * pl) / 100d;
    	private double hauteurFenetreDouble = (hauteurEcran * ph) / 100d;
     
    	private int largeurFenetre = (int) largeurFenetreDouble;
    	private int hauteurFenetre = (int) hauteurFenetreDouble;
     
     
    	public LaFrame() {
    		this.setTitle("Nouveau Jeu");
    		this.setSize(largeurFenetre, hauteurFenetre);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    		this.setResizable(false);
     
    		this.setContentPane(panG);
     
    		h = this.getContentPane().getHeight();
    		w = this.getContentPane().getWidth();
    		System.out.println(h);
    		System.out.println(w);
    	}
     
    }
    Avec ce code, h et w renvoient "0" dans la console...

  4. #4
    Nouveau membre du Club Avatar de Aimka_
    Homme Profil pro
    Collégien
    Inscrit en
    octobre 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : octobre 2019
    Messages : 14
    Points : 30
    Points
    30
    Par défaut
    J'ai fais mes tests et ce code renvoie les bonnes dimensions.

    Donc cela viens forcement de ton "GeneralPanel" . Essaye de regarder ce qui pourrait modifier sa taille

    Bonne chance

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    juin 2015
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : juin 2015
    Messages : 146
    Points : 44
    Points
    44
    Par défaut
    Voici le code de mon PanGeneral :
    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
    public class PanGeneral extends JPanel {
    	JPanel panHaut = new panh.PanH0();
    	JPanel panCentral = new panc.PanC0();
    	JPanel panBas = new panb.PanB0();
    	private Image fond, zoom;
     
    	private double largeurFrame = (LaFrame.largeurEcran * 80d) / 100d;
    	private double hauteurFrame = (LaFrame.hauteurEcran * 80d) / 100d;
    	private int lf = (int) largeurFrame;
    	private int hf = (int) hauteurFrame;
     
     
    	public PanGeneral() {
    		this.setOpaque(false);
    		this.setLayout(new BorderLayout());
     
    		try {
    			fond = ImageIO.read(this.getClass().getResource("/base/fondfirstgame2.png"));
    			} catch (IOException e) {e.printStackTrace(); }
    			zoom = scaleImage(fond, lf, hf);
     
    		this.add(panHaut, BorderLayout.NORTH);
    		this.add(panCentral, BorderLayout.CENTER);
    		this.add(panBas, BorderLayout.SOUTH);
    	}
     
    	public void paintComponent (Graphics g) {
    		g.drawImage(zoom, 0, 0, lf, hf, this);
    	}
     
    	public static Image scaleImage(Image source, int width, int height) {
    	    BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    	    Graphics2D g = (Graphics2D) img.getGraphics();
    	    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    	    g.drawImage(source, 0, 0, width, height, null);
    	    g.dispose();
    	    return img;
    	}
    }
    Aucune valeur de taille n'est spécifiée car c'est le borderLayout qui s'occupe de remplir l'espace. Du coup je ne vois pas ce que je peux faire...

  6. #6
    Nouveau membre du Club Avatar de Aimka_
    Homme Profil pro
    Collégien
    Inscrit en
    octobre 2019
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : octobre 2019
    Messages : 14
    Points : 30
    Points
    30
    Par défaut
    Bon après un autre test il se trouve que si une fenêtre n'est pas visible elle renvoie 0 à this.getContentPane.getSize(); donc ton erreur ne viens pas du tout de ton JPanel.
    Elle était sous nos yeux

    Je reprends donc ton code et je rajoute la petite méthode this.setVisible(true); et pouf : ça marche !

    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
    public class LaFrame extends JFrame {
    	private PanGeneral panG = new PanGeneral(); // ça c'est mon JPanel
    	private float pl = 80f;
    	private float ph = 80f;
     
    	int h = 0;
    	int w = 0;
     
    	private static Toolkit t = Toolkit.getDefaultToolkit();
    	private static Dimension d = t.getScreenSize();
     
    	public final static double largeurEcran = d.width;
    	public final static double hauteurEcran = d.height;.
    	private double largeurFenetreDouble = (largeurEcran * pl) / 100d;
    	private double hauteurFenetreDouble = (hauteurEcran * ph) / 100d;
     
    	private int largeurFenetre = (int) largeurFenetreDouble;
    	private int hauteurFenetre = (int) hauteurFenetreDouble;
     
     
    	public LaFrame() {
    		this.setTitle("Nouveau Jeu");
    		this.setSize(largeurFenetre, hauteurFenetre);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    		this.setResizable(false);
     
    		this.setContentPane(panG);
     
                    this.setVisible(true);
     
    		h = this.getContentPane().getHeight();
    		w = this.getContentPane().getWidth();
    		System.out.println(h);
    		System.out.println(w);
    	}

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    juin 2015
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : juin 2015
    Messages : 146
    Points : 44
    Points
    44
    Par défaut
    Excellent !!!
    Mille mercis, ça fonctionne !
    Effectivement c'était sous mes yeux. Tellement que je ne l'ai pas vu...

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

Discussions similaires

  1. [Débutant] Récupérer la taille des fichiers/dossiers dans une même variable
    Par Bylliboy dans le forum VB.NET
    Réponses: 11
    Dernier message: 18/06/2014, 13h50
  2. Récupérer la taille des bordures d'une fenêtre
    Par zenux dans le forum Débuter
    Réponses: 4
    Dernier message: 09/05/2012, 19h49
  3. [AC-2002] Récupérer taille des fichiers dans une table
    Par Jean-Luc80 dans le forum VBA Access
    Réponses: 3
    Dernier message: 22/11/2011, 12h22
  4. Récupérer la tailles des images dans un Richtextbox
    Par Cedric33 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 09/09/2009, 11h56
  5. Récupérer la taille des répertoires
    Par nefast dans le forum Programmation et administration système
    Réponses: 21
    Dernier message: 27/11/2008, 10h22

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