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 :

Problème entre le code et l'affichage


Sujet :

Interfaces Graphiques en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2018
    Messages : 4
    Par défaut Problème entre le code et l'affichage
    Bonjour, Bonsoir !

    Je vous contacte parce que je tombe sur une coquille ! Je développe depuis quelques temps en Java, et je fais des parfois des interfaces.
    Je me suis aperçu que parfois les différents objets, notamment les Label, ne se positionnent pas correctement.

    Actuellement je suis entrain de faire un formulaire avec :
    - JLabel
    - TextField
    - ComboBox
    - JButton

    J'ai crée ma petite méthode qui me permet de créer et positionner tous ces objets ci dessous :
    Nota : Je fais un Jeu de Rôle, ne soyez pas choqués par les questions

    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
    	public void creation_formulaire()
    	{
    		removeAll();
     
    	    l_titre = new JLabel();
    	    l_titre.setText("Creation personnage");
    	    l_titre.setBounds(600, 20, 60, 35);
    		pan.add(l_titre);
     
    	    l_nom_perso = new JLabel("Nom du personnage");
    	    l_nom_perso.setBounds(25, 205, 120, 50);
    		pan.add(l_nom_perso);
    		le_nom_perso = new TextField("Nom");
    		le_nom_perso.setBounds(25, 305, 120, 25);
    		le_nom_perso.setEditable(true);
    		pan.add(le_nom_perso);
     
    		l_choix_race = new JLabel("Choix de la race");
    		l_choix_race.setBounds(25, 405, 300, 50);
    		pan.add(l_choix_race);
    		cb_choix_race = new JComboBox(choix_race);
    		cb_choix_race.setBounds(25, 505, 120, 50);
    		cb_choix_race.setSelectedIndex(4);
    		cb_choix_race.addActionListener(this);
     
    		l_choix_classe = new JLabel("Choix de la classe");
    		l_choix_classe.setBounds(425, 405, 300, 50);
    		pan.add(l_choix_classe);
    		cb_choix_classe = new JComboBox(choix_classe);
    		cb_choix_classe.setBounds(425, 505, 120, 50);
    		cb_choix_classe.setSelectedIndex(4);
    		cb_choix_classe.addActionListener(this);
     
    		l_choix_religion = new JLabel("Choix de la religion");
    		l_choix_religion.setBounds(25, 705, 300, 50);
    		pan.add(l_choix_religion);
    		cb_choix_religion = new JComboBox(choix_religion);
    		cb_choix_religion.setBounds(25,805, 120, 50);
    		cb_choix_religion.setSelectedIndex(4);
    		cb_choix_religion.addActionListener(this);
     
    	    b_valid = new JButton("Valider");
    		b_valid.setLocation(600, 650);
    		b_valid.setSize(100,35);
    		b_valid.addActionListener(this);
    		pan.add(b_valid);
     
    		repaint();
    	}
    Normalement c'est censé donner :

    - Label Titre

    - Label Nom perso
    - TextField Nom perso

    - Label Choix de la race - Label Choix de la classe
    - JComboBox Choix de la race - JComboBox Choix de la classe

    - Label Choix de la religion
    - JComboBox Choix de la religion

    - JButton Valider

    Après je sais que au niveau du Bounds ce n'est pas encore bien positionner pour ma fenêtre (1400x750).
    J'ai essayé de bouger, de laisser que deux labels ou autres.
    Mais j’obtiens ceci :
    Nom : jdr_photo.png
Affichages : 258
Taille : 6,5 Ko

    Si vous avez des remarques !

    Merci et bonne journée/soirée !
    Images attachées Images attachées  

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Tu n'es pas censé appeler toi même setBounds, c'est le LayoutManager qui s'en charge. (FlowLayout, GridLayout, GridBagLayout, SpringLayout, ... en fonction de tes besoins). Du coup tes setbounds sont ignorés puisque rappelé par le layoutmanager.

    Si tu a besoin d'un positionnement non standard de tes éléments, il est préférable que tu implémente un LayoutManager plutot que d'essayer de placer les éléments comme ça, ça permettra déjà de t'adapter aux différents affichages, DPIs et tailles de fenêtres.

    Quand on a changé le contenu d'un conteneur visible, ce n'est pas repaint() qu'il faut appeler, c'est invalidate() pour qu'il refasse ses calculs de positionnement.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2018
    Messages : 4
    Par défaut
    Bonjour Tchize_,

    Merci de ta réponse !

    J'avoue que j'utilisais le setBounds surtout sur les labels (un copier coller qui est resté).
    Même si sur une autre interface le setBounds ne me posait pas de problème et je n'ai aucun soucis avec.
    J'ai remplacé par un bon vieux setLocation et setSize. Pour le moment je veux faire juste des tests avec ma bdd, donc pour le placement multi-fenêtre, j'avoue que c'est pas ma priorité. Même si après je compte me mettre à dessiner mon interface pour pouvoir faire mes différents zones de travail.

    En ce qui concerne la partie avec le repaint et invalidate. J'utilise cette méthode afin de créer (pour la première fois) et de mettre à jour les divers items. De ce fait je peux pas me permettre de ne pas mettre le repaint. (Sinon certains labels ne s'affichent que lors du deuxième passage dans la méthode)
    Pour le moment mon formulaire n'est pas complet, il me manque à ajouter tous les labels d'erreur. Du coup ce sera à coup de setVisible, d'où la nécessité du repaint.

    En écrivant ce message, je pense avoir trouver une solution temporaire.
    Âme sensible de la programmation veuillez vous abstenir : Je fais un double appels de ma méthode et ça marche.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Americium Voir le message
    J'ai remplacé par un bon vieux setLocation et setSize.
    Qui reviens au même problème, setBounds nétant qu'un raccourcis pour les deux

    Citation Envoyé par Americium Voir le message
    Pour le moment je veux faire juste des tests avec ma bdd
    Du coup je me demande pourquoi tu t'emmerde à ne pas utiliser un layout standard, ça te ferais moins de code et moins d'emmerdes


    En ce qui concerne la partie avec le repaint et invalidate. J'utilise cette méthode afin de créer (pour la première fois) et de mettre à jour les divers items. De ce fait je peux pas me permettre de ne pas mettre le repaint. (Sinon certains labels ne s'affichent que lors du deuxième passage dans la méthode)
    Le repaint sert pour un composant custom à signaler à swing qu'il y a des changement dont il n'est pas au courant. On n'a pratiquement jamais besoin de faire un appel explicite à repaint(). Pareil pour le setVisible(). Un simple appel à invalidate() suffit au conteneur pour pour faire sa popote interne et décider si, oui ou non, il faut redessiner et surtout quelles zones sont à redessiner.
    Du coup ce sera à coup de setVisible, d'où la nécessité du repaint.
    Non

    Je fais un double appels de ma méthode et ça marche.
    Je peux faire rentrer une vis dans du bois avec un marteau, c'est pas pour ça que c'est une solution et que ça tiendra...

  5. #5
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2018
    Messages : 1
    Par défaut SpringLayout
    Bonjour à vous

    Moi je suis un nouveau étudiant en programmation.
    Je vient de commencer java. Excusez-moi si je dois vous embêter avec mes questions un peu bêtes.

    Je veux savoir comment utilisé la méthode SpringLayout pour organiser les zones de textes et les champs de saisie que j'ai crée.
    Genre un code pour me montrer l'utilisation de SpringLayout.

    Merci de m'aider svp

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2018
    Messages : 4
    Par défaut
    Bonjour !

    Citation Envoyé par tchize_
    Qui reviens au même problème, setBounds nétant qu'un raccourcis pour les deux
    Je suis d'accord, en soit c'est là même chose. Mais je trouve finalement plus claire de mettre le setLocation et setSize. ça rend mon code un peu plus homogène.

    Citation Envoyé par tchize_
    Du coup je me demande pourquoi tu t'emmerde à ne pas utiliser un layout standard, ça te ferais moins de code et moins d'emmerdes
    Si on part de ce principe, autant que je lui envoie des variables statiques, je suis d'accord. Mais vue que je développe ça pour jouer avec des amis, je vais les mettre à contribution dans le futur pour qu'ils puissent tester. Du coup là je travaille juste sur la liaison bdd et sur la préface de l'interface. Pour le moment je compte pas rendre un layout non-dynamique (avec les tailles de fenêtres).
    En soit pour me "faciliter" la tâche à partir d'où je suis, je pourrai très bien rajouter un coef multiplicateur (taille screen/taille que j'ai programmé) à toutes mes tailles & positions d'objets.

    Citation Envoyé par tchize_
    Le repaint sert pour un composant custom à signaler à swing qu'il y a des changement dont il n'est pas au courant. On n'a pratiquement jamais besoin de faire un appel explicite à repaint(). Pareil pour le setVisible(). Un simple appel à invalidate() suffit au conteneur pour pour faire sa popote interne et décider si, oui ou non, il faut redessiner et surtout quelles zones sont à redessiner.
    Je te donne un exemple pour lequel cela n'a pas marché.
    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
    public void create_stuff()
    	{
    		pan.removeAll();
     
    		b_valid = new JButton("Validate");
    		b_explore = new JButton("Explore");
     
    		b_valid.setLocation(275, 150);
    		b_explore.setLocation(25, 25);
     
    		b_valid.setSize(100,35);
    		b_explore.setSize(100,35);
     
    		b_valid.addActionListener(this);
    	    b_explore.addActionListener(this);
     
    	    pan.add(b_valid);
    	    pan.add(b_explore);
     
    		le_somme = new TextField();
    		if(line_edit!="")
    			le_somme.setText(line_edit);
    		else
    			le_somme.setText("Lien ");
    		le_somme.setBounds(25, 65, 600, 20);
    		le_somme.setEditable(true);
    		pan.add(le_somme);
     
    		label_good = new JLabel();
    		label_good.setText("The document was created !");
    		label_good.setBounds(25, 85, 200, 50);
    		label_good.setVisible(label_good_i);
    		pan.add(label_good);
     
    		l_version = new JLabel();
    		l_version.setText("Version 1.1");
    		l_version.setBounds(600, 275, 100, 50);
    		pan.add(l_version);
     
    		JLabel image = new JLabel();
    	    image= new JLabel( new ImageIcon("D:\\espace_java\\document_tracker\\src\\document_tracker\\téléchargement.jpg"));
    	    image.setSize(250,200);
    	    image.setLocation(25, 150);
    	    pan.add(image);
     
    	    pan.invalidate();
    	}
    Lorsque je le lance au démarrage j'ai ma création d'interface. Mais les labels suivants ne s'affichent pas : image & l_version
    Il ne s'affiche que la seconde fois lors de l'appui sur mon bouton b_valid. Où son appui reboucle sur le même programme.
    D'après ce que tu me dis sur le repaint() et invalidate(). Il faudrait que je fasse deux méthodes, l'une qu'au démarrage et l'autre qui actualise durant l'utilisation de celui-ci ?

    Citation Envoyé par tchize_
    Je peux faire rentrer une vis dans du bois avec un marteau, c'est pas pour ça que c'est une solution et que ça tiendra...
    J'y vais au marteau piqueur ! Non mais comme j'ai dis c'est une solution temporaire.
    C'est pas quelque chose dont je me satisfais mais pour le moment ça me permet de faire ce que je veux.
    Si tu as une fuite d'eau, tu mets du scotch pour bloquer la sortie d'eau avant de ressouder ou changer le tuyau !

Discussions similaires

  1. Problème entre LDAP et mysql dans un même code PHP
    Par tissard dans le forum Langage
    Réponses: 6
    Dernier message: 22/03/2011, 09h04
  2. [MySQL] Problème dans mon code entre une recherche mysql et en php
    Par pasbonte dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 27/12/2008, 14h04
  3. Réponses: 6
    Dernier message: 17/12/2007, 16h16
  4. Réponses: 4
    Dernier message: 16/07/2007, 10h16
  5. Problème entre affichage et traitement d'un string
    Par leneuf dans le forum Langage
    Réponses: 4
    Dernier message: 10/10/2006, 18h27

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