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 :

panel apparent une fois sur deux


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 panel apparent une fois sur deux
    bonjour à tous,

    débutant en java, j'ai réalisé une petite interface graphique minimum :

    une fenêtre, définie dans la classe MyWindow.
    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
    package Mon_Interface;
    import javax.swing.JFrame;
     
    @SuppressWarnings("serial")
    public class MyWindow extends JFrame   {
     
     
    	public MyWindow ()   { // mon constructeur de fenetre
     
    		super ();
    		this.isAlwaysOnTop();
    		this.setVisible(true);
    		this.setSize(500, 500);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); }	
     
    										}
    un panel défini dans la classe mon_panneau_bas.
    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
    package Mon_Interface;
     
    import java.awt.Color;
    import java.awt.Dimension;
    import javax.swing.JPanel;
     
    @SuppressWarnings("serial")
    public class mon_panneau_bas  extends JPanel   
    {
     
     
     
    	public mon_panneau_bas ()
    	{
    		this.setBackground(Color.YELLOW );
    		this.setPreferredSize(new Dimension (100,100));
     
    	}	
    }
    La classe de démarrage main :
    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
    56
    57
    58
    59
    60
    61
    62
    package Mon_Interface;
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
     
     
     
    public class start4
    {
     
    	public static void main(String[] args) 
    	{
     
     
     
    			//Réalisation de la fenetre et affichage		
    			MyWindow ma_fenetre = new MyWindow();
    			mon_panneau_bas panneau_bas_1 = new mon_panneau_bas () ;
     
     
    			//	Création des boutons
    				JButton btnV = new JButton ("Valider");
    				JButton btnQ = new JButton ("Quitter");
    				JButton btnD = new JButton ("Démarrer");
     
    			// Création des listners
    				btnD.addActionListener(new ActionListener() {  
    					@Override // méthode qui implémente une interface
    					public void actionPerformed(ActionEvent e) {
    						System.out.println(("le bouton Démarrer a été pressé!"));
    															   }  
    															});  
     
    				btnV.addActionListener(new ActionListener() {  
    					@Override// méthode qui implémente une interface
    					public void actionPerformed(ActionEvent e) {
    					System.out.println(("le bouton Valider a été pressé!"));
    															   }  
    															});  
     
    				btnQ.addActionListener(new ActionListener() {  
    					@Override// méthode qui implémente une interface
    					public void actionPerformed(ActionEvent e) {
    					System.out.println(("le bouton Quitter a été pressé!"));
    																}  
    															});  
     
    			// mise en place des boutons sur le panel	
    				panneau_bas_1.add( btnD );
    				panneau_bas_1.add( btnV );
    				panneau_bas_1.add( btnQ );
     
     
    		// Mise en place du panel sur la fenetre
    		ma_fenetre.add (panneau_bas_1, BorderLayout.SOUTH) ;
     
     
     
    		}
    }
    Le problème est que cela fonctionne de manière aléatoire semble-t-il.
    La fenêtre est générée à chaque fois, mais le panneau jaune en bas avec les boutons, pas toujours hélas...
    Nom : panel_ok.png
Affichages : 106
Taille : 6,2 Ko
    Nom : panel_pas_ok.png
Affichages : 101
Taille : 3,0 Ko

    Si je mets un seul bouton, ça semble fonctionner à chaque fois...

    Ça me parait étrange que le fonctionnement puisse être aléatoire....

    Mon erreur est peut-être évidente pour un initié d'Eclipse.

    Merci...

  2. #2
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 326
    Points : 439
    Points
    439
    Par défaut
    Bonjour,

    Ce genre de problème est souvent du à la gestion du "dessin" de Swing. Vous pouvez forcer un rafraîchissement avec repaint ou revalidate mais je préfère éviter ce genre de choses. POouvez vous essayer de commenter la ligne this.setVisible(true); de MyWindow et de n'appeler cette méthode que lorsque tout est mise en place. A la fin du main par exemple ?

  3. #3
    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 bien vu!
    Bonjour gervais,

    j'ai testé en mettant le "ma_fenetre.setvisible (true)" à la fin du "main", comme tu me l'as suggéré.

    En effet, à présent cela fonctionne à chaque fois.

    Cela résout mon problème, bien que je ne sache pas vraiment pourquoi, mais bon.....

    Merci beaucoup!

  4. #4
    Membre averti
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mai 2020
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mai 2020
    Messages : 326
    Points : 439
    Points
    439
    Par défaut
    Swing ne redessine pas toujours les composants. Il y à un système d'invalidation qui est utilisé pour redessiner un composant qui à changé. Et encore, je ne suis pas sur qu'il redessine immédiatement.

    Il suffit de redimensionner la fenêtre pour détecter ce genre de problèmes car ça force un "repaint". Il faut alors se poser la question de savoir si l'interface est bien construite avant d'être rendue visible (et dessinée). Si c'est le cas ou qu'il n'y à pas d'autres solutions, alors on peux commencer à jouer avec invalidate/validate et repaint dans le pire de cas.

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

Discussions similaires

  1. Fermer une fenetre : ça marche une fois sur deux
    Par floanne dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 29/05/2007, 13h27
  2. getElementById qui retourne "" une fois sur deux
    Par Cronycs dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/05/2007, 17h33
  3. Carte Wifi s'allume une fois sur deux
    Par czarama dans le forum Réseau
    Réponses: 1
    Dernier message: 23/09/2006, 15h21
  4. le sous formulaire s'affiche une fois sur deux
    Par Math dans le forum Access
    Réponses: 16
    Dernier message: 10/10/2005, 15h25
  5. Pb : malloc qui marche une fois sur deux .... ?
    Par guillaume_pfr dans le forum C
    Réponses: 14
    Dernier message: 21/07/2003, 09h52

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