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

Interfaces Graphiques en Java Discussion :

actualisation de "getSize()" pour redimensionner un objet de type JPanel


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre habitué

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 167
    Points : 162
    Points
    162
    Par défaut actualisation de "getSize()" pour redimensionner un objet de type JPanel
    bonjour,

    je travaille avec swing, sur une interface graphique pour faire un petit logiciel de schéma électrique.

    L'objet contenant est de type JPanel, nommé "g1", qui contient mes composants perso.

    L'aspect est le suivant :
    Nom : interface 02 02 2022.png
Affichages : 108
Taille : 13,5 Ko


    Au re-dimensionnement de la fenêtre par l'utilisateur, les postions des objets sont re-calculés pour que les écarts soient à nouveau égaux et que la présentation soit maintenue. Cela fonctionne grâce à une fonction "actualiser(size), qui, dans le paintComponent de g1, recalcule les positions avec comme argument la taille actuelle du JPanel g1.

    Cependant, j'ai besoin également des ratios de redimensionnement, nommés rx et ry, pour recalculer les longueurs de chaque morceau de fil.
    Pour cela j'ai ajouter ce code dans la paintComponent de mon objet g1 :
    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
    //		 MON PAINTCOMPONENT(Graphics g) 
    	public void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		Graphics2D g2 = (Graphics2D)g;
    		System.out.println();
    		System.out.println("---------------------j'entre dans le paintComponent_MaGrille----------------------------");
     
    		System.out.println(" A L'entrée de PAINTCOMPNENT,     this.getSize = "+ this.getSize() + "    et g1_Actual_Size = " + g1_Actual_Size);
     
     
    		// Si la grille a été redimensionnée, on attend que les dimensions soient stabilisées pour actualiser les nouvelles positions des objets.
    		if (!this.getSize().equals(g1_Actual_Size)) {
    			System.out.println(" à l'entrée du IF,       this.getSize = "+ this.getSize() + "    et g1_Actual_Size = " + g1_Actual_Size);
     
    				// tant que les dimensions varient, on temporise...
    				while (!this.getSize().equals(g1_Actual_Size)) {
    					System.out.println(" à l'entrée du WHILE DIFFERENT,       this.getSize = "+ this.getSize() + "    et g1_Actual_Size = " + g1_Actual_Size);
     
    						try { // Actualiser la taille et attendre 3s
    							System.out.println();
    							System.out.println("Avant la TEMPO,       this.getSize = "+ this.getSize() + "    et g1_Actual_Size = " + g1_Actual_Size);
    								g1_Actual_Size = this.getSize();
    							Thread.sleep(300);
    							System.out.println("APRES la TEMPO,       this.getSize = "+ this.getSize() + "    et g1_Actual_Size = " + g1_Actual_Size);
    							System.out.println();
     
    						} 
    						catch (InterruptedException e) {
    							// TODO Auto-generated catch block
    							e.printStackTrace();
    						}
    						finally { System.out.println("FINALLY");
    						}
    				}// fin du "while"
     
    				// quand la taille est stabilisée on appelle le redimensionnement...		
    					float ratioX = (float) g1_Actual_Size.width / g1_Old_Size.width;
    					float ratioY = (float) g1_Actual_Size.height/ g1_Old_Size.height;
    					System.out.println(" dans paintComponent on est sorti du while, nouveau rx=" + ratioX + "  nouveau ry=" + ratioY);
    					g1_Old_Size = g1_Actual_Size;
    					actualiser (g1_Actual_Size);	
    					Redim_fils.redim_fil3(ratioY);
     
     
     
    		}// fin du if changement de dimension
    La console affiche :
    Nom : console_redim.png
Affichages : 94
Taille : 273,9 Ko

    Principe : je teste si on est dans le paintComponent à cause d'un redimensionnement de g1. Si c'est le cas, on teste toutes les 300ms, si la taille est stabilisée, et sinon, on boucle. Si la taille ne change plus, on sort et on peut poursuivre et recalculer une seule fois, les nouveaux ratios rx et ry.

    Problème : A la moindre variation de dimension on entre bien dans ce code, mais on sort chaque fois, même si la taille continue à évoluer.
    En effet, apparemment, dans le try, j'utilise le "getSize() au début, puis après 300ms, pendant que les dimensions continuent à évoluer, mais le résultat semble identique, alors forcement, je sors du "while"...

    Question : pourquoi, alors que les dimensions ne sont pas stabilisées, le test "getSize()", avec 300ms d'attente reste identique et provoque ma sortie de la bouche "while"??

    Merci à tous pour vos éventuelles lumières......

  2. #2
    Membre habitué

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 167
    Points : 162
    Points
    162
    Par défaut
    Après plusieurs heures de tests divers, il semble que le "getSize" de mon panel, soit actualisé uniquement à chaque appel de son "paintComponent".
    A chaque appel de ma part, en fait, il se contente de lire la valeur déjà en stock, et donc, même si je temporise pour lire à nouveau le "getSize", j'ai à chaque fois la même valeur, car ce n'est pas moi qui ait la main pour l'actualiser, ce qui ne se fera à priori que sur la nouvelle exécution du "paintComponenet".

    Sachant cela, j'ai opéré différent, pour mon problème de redimensionnement de panel, avec les taux de variations rx et ry.

    Cela fait naître une nouvelle question qui faciliterait grandement mon traitement :

    Les Jframes ou JPanels, ont-ils une propriété qui donnerait leur état actuel : "dimensions constantes" ou "dimensions en cours de changement", que l'on pourrait lire directement pour un traitement perso??

    merci...

  3. #3
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 084
    Points : 7 998
    Points
    7 998
    Par défaut
    Ca ne serait pas plus simple d'utiliser un ou des Layout qui vont bien tout seul ? Parce la, en plus, un while avec un sleep dedans dans paintComponent, c'est pas trop ce qui est conseillé.

  4. #4
    Membre habitué

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 167
    Points : 162
    Points
    162
    Par défaut
    en fait, je n'utilise par les layouts, car le positionnement au pixel me permet en permanence de maintenir des écarts horizontaux et verticaux, entre mes objets, re-calculés et égaux par rapport à ma grille perso.

    De plus, quand je mets des fils qui lient mes éléments (ensemble de 1 à 5 segments vertical ou horizontal), je cherche à moduler leurs longueurs et positons, à la fin d'un changement de dimension de mon conteneur, pour visuellement, avoir le même rendu à une échelle différente.

    Le re-calcul des écarts et le re-positionnement des objets à leur nouvelle emplacement est plutôt simple et ça fonctionne bien.

    La difficulté réside dans le re-calcul des segments de liaison (invisible ici mais visible sur mes conversations précédentes) car nécessite un vrai traitement logique. Ce traitement doit se lancer au "repaint()" mais pas à chaque fois, car lourd pour rien si les dimensions de la frame n'ont pas changées.

    C'est donc pour cela que sur le repaint(), je cherchais à isoler un repaint quelconque ou un repaint pour cause de redimensionnement de l'interface graphique.

    J'ai réalisé un petit code pour me dérouter du repaint, uniquement si les dimensions de la jframe ont changé et qu'à présent ces dimensions sont stabilisées. C'est uniquement dans ce cas ou je vais tenter de remettre à l'échelle toutes mes portions de fils....

    Je pensais que ce problème de mise à l'échelle était un problème courant et abordé de manière aboutie, par des propriétés par exemple des jframe ou des jpanel qui diraient :
    - les dimensions du panel sont stables.
    - les dimensions du panel sont en train de changer.
    - les dimensions du panel sont stable depuis...1s par exemple.
    Cela permettrait de réagir avec des traitements de mise à l'échelle au moment utile..

    Enfin, c 'est ce que j'ai tenté de faire et que je vais essayer d'appliquer dans mon cas.

    Merci wax78 pour ce petit signe

Discussions similaires

  1. [AC-2007] quel type de variable pour récupérer des objets de type Ole
    Par rominous41 dans le forum VBA Access
    Réponses: 2
    Dernier message: 25/05/2011, 16h59
  2. Réponses: 0
    Dernier message: 28/02/2008, 18h33
  3. Réponses: 3
    Dernier message: 28/10/2005, 01h12
  4. [JS] Problème de quotes pour enregistrer un formulaire.
    Par polnioumane dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 24/10/2005, 17h04

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