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

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 26
    Points : 14
    Points
    14
    Par défaut Faire des dessins qui s'adaptent à la taille de la fenêtre, et gérer des évènements par rapport à ces dessins
    Bonjour,
    voila mon problème, je me demandai comment dessiner, par exemple, un damier dans un JPanel qui s’adapterait à la taille de la fenêtre, et comment savoir dans quelle case on a cliqué sachant que sa taille change.
    Faut-il à chaque fois récupérer la taille du JPanel et dessiner tout en fonction de celle-ci, ou y a-t-il une manière plus simple ?
    Merci.

  2. #2
    Membre averti Avatar de Doopeijii
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 215
    Points : 323
    Points
    323
    Par défaut
    Il faut que tu dessine ton damier dans la méthode "paint" afin que lors du redimensionnement il soir redessiné. Par contre il faut que tu prennes en compte les dimensions de ton JPanel pour le dessiner du coup, à toi de trouver l'astuce (un carreau représente un pourcentage de ton JPanel ?)
    Pour ce qui est des écouteurs, il faut que tu récupère la position de la souris sur ton application et que tu écoute le click afin de savoir quel carré est cliqué.
    Un petit n'est pas de trop si le message est utile

    "Vous êtes très nombreux dans votre cas? J'ai jamais pensé que les cons étaient en minorité..."

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    enfin une réponse ^^
    Depuis le temps j'ai avancé et je dessine tout dans la méthode paintComponent.

    En réalité c'est pas juste un damier que je fais, c'est le jeu quarto, je dois donc affiché un damier de 4*4 et les pièces restante à coté, ainsi que la pièce en cours choisi par le joueur adverse (ça c'est pas encore fait) et le nom du joueur en cours.

    Ce qui me rassure c'est que je n'ai pas commencé pour rien, visiblement il n'y a pas de méthode simple donc je me suis en effet fixé des pourcentages pour chaque chose que je dois dessiner et ça fonctionne bien, je sais si je clique sur une pièce ou sur quelle case du damier, mais avec le recul je ne suis pas sur que la méthodes des pourcentages soit la meilleure, j'ai des calculs énormes parfois avec toutes les marges que je me suis fixé entre chaque chose que je dois affiché.
    Je pense que j'aurai du me fixer des valeurs de base, genre pour un JPanel de 100*100 je fixe les coordonnés et les tailles de ce que je veux dessiner, et je les recalcule quand la taille du JPanel change (si la taille a augmenté de 10% les valeur augmenteront aussi de 10%).
    Enfin, je sais pas si c'est plus simple mais j'essayerai ^^ la ou j'ai galéré et je pense qu'il y a plus simple c'est pour dessiner du texte qui s'adapte à la taille du JPanel, j'ai un truc moche comme ça :
    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
     
    		boolean ok=false;
    		int fontSize = 0;
    		int longueur = -1;
    		int hauteur = -1;
    		while (!ok) {
    			if (longueur>DesignSingleton.getInstance().getTextWidthMax() || hauteur>DesignSingleton.getInstance().getTextHeightMax()) {
    				fontSize--;
    				ok = true;
    			} else {
    				fontSize++;
    			}
    			//g.setFont(font.deriveFont(fontSize));
    			Font font = new Font(Font.SERIF,Font.PLAIN,fontSize);
    			g.setFont(font);
    			FontMetrics fontMetrics = g.getFontMetrics();
    			longueur = fontMetrics.stringWidth(observable.getPlayer()+".");
    			hauteur = fontMetrics.getHeight();
    		}
    j'ai essayé d'utiliser les deriveFont mais ça ne fonctionnait pas.
    En fait j'essaye de trouver la taille la plus grande en dessous des marges que je me suis fixé. j'ai d'ailleurs un doute si ça fonctionne vraiment pour la longueur d'ailleurs.

  4. #4
    Membre averti Avatar de Doopeijii
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 215
    Points : 323
    Points
    323
    Par défaut
    Pour la taille du texte, j'ai fait un truc similaire (attention je te donne tout il faut adapter, virer des trucs et en rajouter). Au fait je calcule la hauteur et largeur du texte en fonction de ceux de la fenêtre (t'auras à adapter en fonction de tes labels/panels/...)
    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
    public void paintComponent(Graphics g) {
    		int x, y, laff, haff, ltxt, htxt;
    		Color c;
    		String texte;
    		if (laFile.estVide()) {
    			c = Color.green;
    			texte = "Pas de valeur !";
    		} else {
    			texte = "Tete : " + laFile.valeurEnTete();
    			if (laFile.estSaturee()) {
    				c = Color.red;
    			} else {
    				c = Color.orange;
    			}
    		}
    		laff = getWidth();
    		haff = getHeight();
    		Font maPolice = new Font("Arial", Font.BOLD, haff / 6);
    		g.setFont(maPolice);
    		FontMetrics fm = g.getFontMetrics();
    		ltxt = fm.stringWidth(texte);
    		htxt = fm.getAscent();
    		x = (laff - ltxt) / 2;
    		y = (haff - htxt) / 2;
    		g.setColor(c);
    		g.fillRect(0, 0, laff, haff);
    		g.setColor(Color.black);
    		g.drawString(texte, x, y);
    		texte = laFile.toString();
    		ltxt = fm.stringWidth(texte);
    		x = (laff - ltxt) / 2;
    		y = (haff + htxt) / 2;
    		g.drawString(texte, x, y);
    	}
    Un petit n'est pas de trop si le message est utile

    "Vous êtes très nombreux dans votre cas? J'ai jamais pensé que les cons étaient en minorité..."

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    en fait tu met la taille de ta police d'écriture à : haff / 6
    elle ne dépend donc que de la hauteur de ton composant !?
    ensuite tu calculs juste les positions ou tu va afficher tes textes.
    moi j'ai effectivement besoin de calculer de nouvelles positions mais aussi d'avoir une taille qui s'adapte en longueur et en largeur à ma fenêtre, c'est pourquoi j'ai une boucle qui tourne jusqu'à atteindre la bonne valeur (dans l'idéal).
    Mais bon dans tout les cas on passe par FontMetrics, par contre tu as utiliser getAscent() au lieu de getHeight() comme moi, c'est quoi la différence concrètement, même avec la javadoc je vois pas trop ce que c'est en fait !?

    sinon j'aurai mis :
    setBackground(c);
    super.paintComponent(g);
    à la place de
    g.setColor(c);
    g.fillRect(0, 0, laff, haff);

  6. #6
    Membre averti Avatar de Doopeijii
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 215
    Points : 323
    Points
    323
    Par défaut
    getAscent ne prend que la partie supérieure des lettres qui passent en dessous de la ligne d'écriture (comme le j, le g, le y, ...) par exemple pour le y il mesurera la partie ressemblant au v.

    Je te donne là une démarche pour un cas plus simple, mais tu peux effectuer la même chose pour la largeur (ou en tous cas t'inspirer de ce qui est fait)
    Un petit n'est pas de trop si le message est utile

    "Vous êtes très nombreux dans votre cas? J'ai jamais pensé que les cons étaient en minorité..."

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    ok je vois.
    je fais un getHeight() sur mon texte, et je me demandais pourquoi je devais le diviser par 4 pour que mon texte soit centré par rapport au point ou je voulais le mettre.
    Enfin bon, j'ai réussi à faire ce que je voulais, mais je m'attendais tout de même à ce qu'il y ai une astuce, de façon à ce que se soit géré automatiquement.

  8. #8
    Membre averti Avatar de Doopeijii
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2012
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 215
    Points : 323
    Points
    323
    Par défaut
    Il y a surement un moyen plus simple, mais je ne le connais pas puisque ce que je t'ai montré correspond à un exercice que j'ai eu à faire
    Un petit n'est pas de trop si le message est utile

    "Vous êtes très nombreux dans votre cas? J'ai jamais pensé que les cons étaient en minorité..."

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

Discussions similaires

  1. Images qui s’adaptent à la taille de la fenêtre sur une même ligne
    Par Leamontreuil dans le forum Mise en page CSS
    Réponses: 0
    Dernier message: 15/10/2014, 07h59
  2. Avoir mes images qui s'adaptent à la taille de la fenêtre
    Par clairetj dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 04/06/2014, 19h02
  3. Image qui s'adapte à la taille de la fenêtre
    Par JulianMarley dans le forum Débuter
    Réponses: 0
    Dernier message: 04/03/2014, 15h35
  4. Réponses: 2
    Dernier message: 22/02/2008, 22h22
  5. Réponses: 2
    Dernier message: 06/04/2007, 13h31

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