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

Agents de placement/Fenêtres Java Discussion :

Rafraichir plusieurs JPanel en même temps


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Rafraichir plusieurs JPanel en même temps
    Bonjour,

    Je souhaite dynamiquement rafraichir un JPanel contenant plusieurs autres JPanel. Je connais bien la méthode repaint() mais en vain !
    Débutant en Java et malgré le temps passé à réfléchir à une solution, je vous sollicite pour avoir un éclairage sur ce problème.
    J'ai 3 classes :
    - 1 classe "debut" (contenant le main)
    - 1 classe "Fenêtre"
    - 1 classe "Panneau"
    L'idée est que dès que l'on branche sur un port USB un Mbed (https://www.mbed.com/en/), les panels de la fenêtre se rafraichit et passe au vert :
    Nom : panel1.jpg
Affichages : 540
Taille : 92,4 Ko

    La détection fonctionne bien.
    Le soucis est que lorsque le JButton est actif, il m'ouvre 2 fois l'application. Je ne comprends pas...
    Voici un bout de code pour la classe "debut:

    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
    		Fenetre fen = new Fenetre(tab_result, nom_prog);
    		fen.setVisible(true);
     
    		do {
    			UsbPresentAbsentAvant = UsbPresent;
     
    			UsbPresent = detectionUsb(tab_result, executable.length, UsbPresent);
     
     
    			try {
     
    			     Thread.sleep(2000);
    	//		  	fen.validate();
    			  	fen.update(null);
    			    fen.InitComponent(tab_result, nom_prog);
    			    fen.setVisible(true);
     
    			    } catch (InterruptedException e) {
     
    			      e.printStackTrace();
    			      }			
     
    		} while (true);
    	}
    Voici un bout de code pour la classe "fenetre":
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    public class Fenetre extends JFrame implements ActionListener {
     
    	private JMenuBar barreMenus;
    	private JMenu file, edit, help;
    	private JMenuItem open, close, cut, copy, about;
     
    //	public Fenetre() {};
     
    	JLabel jLabelMatlab =new JLabel("Matlab",SwingConstants.LEFT); 
        JLabel jLabelEclipse =new JLabel("Eclipse",SwingConstants.LEFT); 
        JLabel jLabelQuartus =new JLabel("Quartus",SwingConstants.LEFT); 
        JLabel jLabelModelsim =new JLabel("ModelSim",SwingConstants.LEFT);
        JLabel jLabelMestReC =new JLabel("MestReC",SwingConstants.LEFT);
        JLabel jLabelMestReNova =new JLabel("MestReNova",SwingConstants.LEFT);
        JLabel jLabelMbed =new JLabel("Mbed",SwingConstants.LEFT);
     
     
        JButton BoutonMatlab = new JButton("MATLAB");
        JButton BoutonEclipse = new JButton("ECLIPSE");
        JButton BoutonQuartus = new JButton("QUARTUS");
        JButton BoutonModelsim = new JButton("MODELSIM");
        JButton BoutonMestReC = new JButton("MESTREC");
        JButton BoutonMestReNova = new JButton("MESTRENOVA");    
        JButton BoutonMbed = new JButton("MBED");
     
        ImageIcon IconVert = new ImageIcon("vert.png");
    	ImageIcon IconRouge = new ImageIcon("rouge.png");
     
    	public Fenetre(int tableau[], String nom_prog[]) {
     
    		super();
    		this.setTitle("Projet");
    		this.setSize(500, 600);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setLocationRelativeTo(null);
    	    this.InitComponent(tableau,nom_prog);
    		}
     
    		public void  InitComponent(int[] tableau, String[] nom_prog)
    		{
     
    		//Panel Matlab
    		JPanel PanMatlab = new JPanel();
    //	    PanMatlab.repaint();
    	    PanMatlab.setBackground(Color.white);
    	    PanMatlab.setPreferredSize(new Dimension(300, 60));
    	    PanMatlab.setBorder(BorderFactory.createTitledBorder("Matlab"));
     
    		PanMatlab.add(jLabelMatlab);
     
    		if(tableau[0]==1){
    			 JLabel JMatlab =  new JLabel(IconVert);
    			 PanMatlab.add(JMatlab);
    			 PanMatlab.add(BoutonMatlab);
    			    BoutonMatlab.setEnabled(true);
    			    BoutonMatlab.addActionListener(this);
     
     
    				}
    		else{
    		    JLabel JMatlab =  new JLabel(IconRouge);
    		    PanMatlab.add(JMatlab);
    		    PanMatlab.add(BoutonMatlab);
    		    BoutonMatlab.setEnabled(false);
     
    		}
    ...
    ...
    	public void actionPerformed(ActionEvent e) {
    		Object source = e.getSource();
    		JOptionPane jop1;
    		// Boîte du message d'information
    		jop1 = new JOptionPane();
     
    		System.out.println("Action avec chaine de commande = " + e.getActionCommand());
     
    		if (source == close)
    			System.exit(0);
    		if (source == about)
    			JOptionPane.showMessageDialog(null,
    					"Projet Java - 04-07-2014", "About",
    					JOptionPane.INFORMATION_MESSAGE);
    		if (source == BoutonMatlab)
    			System.out.println("Action avec chaine de commande = " + e.getActionCommand());	
     
    		if (source == BoutonEclipse)
    			System.out.println("Action avec chaine de commande = " + e.getActionCommand());	
     
    		if (source == BoutonQuartus)
    			System.out.println("Action avec chaine de commande = " + e.getActionCommand());	
     
    		if (source == BoutonModelsim)
    			System.out.println("Action avec chaine de commande = " + e.getActionCommand());	
     
    		if (source == BoutonMbed){
    			System.out.println("Action avec chaine de commande = " + e.getActionCommand());	
    			 Runtime runtime = Runtime.getRuntime();
    			 try {
    				runtime.exec(new String[] {"C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe", "https://mbed.org/"});
     
    			} catch (IOException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    		}
    Voici un bout de code pour la classe "Panneau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Panneau extends JPanel {
     
    	public void paintComponent(Graphics g) {
    		 g.setColor(Color.white);
    		 g.fillRect(0, 0, this.getWidth(), this.getHeight());
    		g.setColor(Color.white);
     
    	}
    }
    Merci pour toutes aides.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    1. A la détection, on déclenche l'appel de initComponent, qui crée un JPanel, référencé par la variable PanMatlab. Mais ce JPanel n'est jamais placé dans aucun conteneur donc il n'est jamais affiché nulle part. Aucun rafraîchissement n'y changera jamais rien.
      Il faut que tu construises la fenêtre une fois (dans son constructeur donc), avec tous ses composants, avec les JButton "disabled" et les "voyants" en rouge. D'ailleurs, en utilisant la notion de disabledIcon, tu pourras traiter le bouton et le voyant de la même manière (setEnabled(true/false) pour les deux), donc simplification du code.
      A la détection, tu appelleras une méthode qui ne fera appellera setEnabled(true) du JButton et du JLabel avec l'image. Il ne faut qu'un moyen de retrouver rapidement les instances de composants correspondant. Pour ça, le mieux est d'utiliser une Map (si le nombre de composants est connu d'avance, fini et fixe, le mieux est d'utiliser une Enum pour repérer les composants, donc une EnumMap, sinon utilise un identifiant de composant de type String, et une HashMap.
    2. A noter que initComponent est appelé une première fois à la construction de la fenêtre, puis une seconde fois lors de la détection : comme initComponent exécute entre autres la ligne suivante BoutonMatlab.addActionListener(this);, et bien, cette ligne est exécutée au moins 2 fois. Il y a donc 2 écouteurs qui font la même chose sur le bouton en question. D'où le fait qu'un clic sur le bouton lance 2 fois l'application associée. Faire comme j'ai dit dans le point 1 évitera en plus ce problème.


    3. supprime cette ligne :
      • l'appel de cette méthode ne doit être fait que dans des processus interne technique, et surtout dans l'Event Dispatch Thread
      • il faut passer une instance de Graphics : passer null doit provoquer une NullPointerException. Dans la mesure où la méthode est censée dessiner une version up-to-date du composant dans l'instance de Graphics passée en paramètre, passer null n'a aucun sens de toute manière.
      • fen.InitComponent(tab_result, nom_prog);
        fen.setVisible(true);
    4. Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      public class Panneau extends JPanel {
       
      	public void paintComponent(Graphics g) {
      		 g.setColor(Color.white);
      		 g.fillRect(0, 0, this.getWidth(), this.getHeight());
      		g.setColor(Color.white);
       
      	}
      Ceci ne sert à rien et contourne ce qui existe déjà pour faire moins bien. Pour afficher un JPanel en blanc, il suffit de faire panel.setBackground(Color.WHITE);. Ceci dit je ne vois pas où tu utilises cette classe.
    5. Il semble que tu sois parti dans l'idée d'utiliser les commandes, mais que tu ne les utilises pas et tu utilises des comparaisons avec des références d'objet à la place. C'était une bonne idée les commande, et un switch pour les traiter sera plus lisible.

    6. Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      fen.InitComponent(tab_result, nom_prog);
      fen.setVisible(true);
      Le setVisible(true) ne sert à rien (il servirait si la fenêtre était rendu invisible par une action, or je n'en vois aucune qui peut le faire)




    PS, à l'avenir, merci de faire l'effort de fournir un code correctement indenté, et respectant les conventions de nommage.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonsoir et merci pour ta réponse.

    J'ai un peu de mal avec le point 1.
    Pour les autres point c'est OK j'ai bien compris.
    Pour le point 1, je n'ai pas fourni tout le code de la classe Fenetre. Tous les JPanel tiennent dans un seul JPanel que je nomme container. J'ignore si cela changera ta réponse. Voici le code complété (mais toujours incomplet)
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
     
     
    public class Fenetre extends JFrame implements ActionListener {
     
         private JMenuBar barreMenus;
         private JMenu file, edit, help;
         private JMenuItem open, close, cut, copy, about;
     
        JLabel jLabelMatlab =new JLabel("Matlab",SwingConstants.LEFT); 
        JLabel jLabelEclipse =new JLabel("Eclipse",SwingConstants.LEFT); 
        JLabel jLabelQuartus =new JLabel("Quartus",SwingConstants.LEFT); 
        JLabel jLabelModelsim =new JLabel("ModelSim",SwingConstants.LEFT);
        JLabel jLabelMestReC =new JLabel("MestReC",SwingConstants.LEFT);
        JLabel jLabelMestReNova =new JLabel("MestReNova",SwingConstants.LEFT);
        JLabel jLabelMbed =new JLabel("Mbed",SwingConstants.LEFT);
     
     
        JButton BoutonMatlab = new JButton("MATLAB");
        JButton BoutonEclipse = new JButton("ECLIPSE");
        JButton BoutonQuartus = new JButton("QUARTUS");
        JButton BoutonModelsim = new JButton("MODELSIM");
        JButton BoutonMestReC = new JButton("MESTREC");
        JButton BoutonMestReNova = new JButton("MESTRENOVA");    
        JButton BoutonMbed = new JButton("MBED");
     
        ImageIcon IconVert = new ImageIcon("vert.png");
        ImageIcon IconRouge = new ImageIcon("rouge.png");
     
    	public Fenetre(int tableau[], String nom_prog[]) {
     
    		super();
    		this.setTitle("Projet");
    		this.setSize(500, 600);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setLocationRelativeTo(null);
    	       this.InitComponent(tableau,nom_prog);
    		}
     
    		public void  InitComponent(int[] tableau, String[] nom_prog)
    		{
     
    		//Panel Matlab
    		JPanel PanMatlab = new JPanel();
       	         PanMatlab.setBackground(Color.white);
    	         PanMatlab.setPreferredSize(new Dimension(300, 60));
    	         PanMatlab.setBorder(BorderFactory.createTitledBorder("Matlab"));
    	        PanMatlab.add(jLabelMatlab);
     
     		if(tableau[0]==1){
    	        	JLabel JMatlab =  new JLabel(IconVert);
     			 PanMatlab.add(JMatlab);
    			 PanMatlab.add(BoutonMatlab);
    			 BoutonMatlab.setEnabled(true);
    			 BoutonMatlab.addActionListener(this);
                            }
    		else{
    		         JLabel JMatlab =  new JLabel(IconRouge);
    		         PanMatlab.add(JMatlab);
    		         PanMatlab.add(BoutonMatlab);
    		         BoutonMatlab.setEnabled(false);
                            }
     
     
    	    //meme code pour tous les autres Panel
     
    ...
    ...
    	   //Container principal contenant les autres JPanels 
               JPanel container = new JPanel();
    	    container.setBackground(Color.white);
    	    container.add(PanMatlab);
    	    container.add(PanEclipse);
    	    container.add(PanQuartus);
    	    container.add(PanModelsim);
    	    container.add(PanMestReC);
    	    container.add(PanMestReNova);
    	    container.add(PanMbed);
     
    	    this.getContentPane().add(container,BorderLayout.CENTER); 
    	    this.setContentPane(container);
    ...
    ...
    public void actionPerformed(ActionEvent e) {
    		Object source = e.getSource();
    		JOptionPane jop1;
     
    		jop1 = new JOptionPane();
    		System.out.println("Action avec chaine de commande = " + e.getActionCommand());
     
    		if (source == close)
    			System.exit(0);
     
    		if (source == about)
    			JOptionPane.showMessageDialog(null,
    					"Projet Java- 04-07-2014", "About",
    					JOptionPane.INFORMATION_MESSAGE);
     
    		if (source == BoutonMatlab)
    			System.out.println("Action avec chaine de commande = " + e.getActionCommand());	
     
    		if (source == BoutonEclipse)
    			System.out.println("Action avec chaine de commande = " + e.getActionCommand());	
     
    		if (source == BoutonQuartus)
    			System.out.println("Action avec chaine de commande = " + e.getActionCommand());	
     
    		if (source == BoutonModelsim)
    			System.out.println("Action avec chaine de commande = " + e.getActionCommand());	
     
    		if (source == BoutonMbed){
    			System.out.println("Action avec chaine de commande = " + e.getActionCommand());	
    			 Runtime runtime = Runtime.getRuntime();
    			 try {
    				runtime.exec(new String[] {"C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe", "https://mbed.org/"});
     
    			} catch (IOException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    		}
     
    	}
    }

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

Discussions similaires

  1. détecter plusieurs messages en même temps
    Par yannickrohel dans le forum Windows
    Réponses: 5
    Dernier message: 20/02/2006, 23h17
  2. Rendre visible / invisible plusieurs éléments en même temps
    Par Bluespike62 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 23/01/2006, 17h43
  3. laisser cochés plusieurs TRadioButton en même temps.
    Par heider dans le forum Composants VCL
    Réponses: 5
    Dernier message: 25/12/2005, 14h15
  4. lecture de plusieurs port en même temps
    Par manaboko dans le forum Langage
    Réponses: 3
    Dernier message: 06/10/2005, 15h26
  5. Réponses: 9
    Dernier message: 17/04/2004, 16h32

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