Partage
  • Partager sur Facebook
  • Partager sur Twitter

[bug] fenetre transparente

JOptionPane.showMessageDialog

    15 février 2009 à 22:24:42

    Salut a toutes et a tous.

    Voila pour un projet perso j'ai fait ma première apply avec interface graphique.
    A force de bidouillages de ci de la j'ai réussi a faire ce que je voulais.
    Le probleme c'est qu'il reste un bug...

    j'utilise une classe Fenetre (extends de JFrame) avec en contentPane une classe Panneau extends de JPanel dans laquelle je dessine via un Graphics
    Seulement voila j'ai un systeme en interne qui me permet d'afficher des erreurs lorsqu'un evenement se produit ou lorsqu'une erreur arrive.
    Et c'est la le probleme des qu'un de ces messages

    JOptionPane.showMessageDialog(null, "Le programme a rencontre une erreur de type #0101");

    comme celui ci apaprait je vois juste une petite fenetre s'ouvrir dont je ne voit que la barre avec la croix fermer, tout le reste de la fenetre prend comme contenu les couleurs qui etaient sur l'ecran un instant plus tot(elle est transparente en quelque sorte).
    Pourtant la fenetre est toujours active elle s'enleve lorsqu'on fait entrée ou lorsqu'on clique la ou devrait se trouver le bouton OK ou lorsqu'on ferme la fenetre via la croix rouge.
    Un ami m'a dit que sa pourrait venir d'un conflit entre ma fenetre principale et les fenetres d'erreurs

    Dites moi si vous avez besoin de mon code(et de quelles parties)

    Merci
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      15 février 2009 à 22:58:51

      salut!
      essaye de rajouter ça ds le constructeur de ta fenêtre
      lenomdetafenetre.setVisible(true);
      lenomdetafenetre.setAlwaysOnTop(true);
      

      • Partager sur Facebook
      • Partager sur Twitter
        15 février 2009 à 23:01:37

        dans le constructeur de ma fenetre principale?
        si c'est le cas je peux pas puisque j'ai justement des options qui me permettent de la faire disparaitre quand j'en ai besoin et de la mettre en icone dans le systray

        si tu parle des fenetres d'erreurs il va falloir que jeredefinisse le constructeur...
        • Partager sur Facebook
        • Partager sur Twitter
          15 février 2009 à 23:35:12

          Pour aller au plus efficace, je pourrais te répondre dès que j'aurais trouvé le soucis, mais il faudrait que je puisse compiler le code chez moi (autrement dit il me faudrait toutes tes sources).
          Pour l'instant j'ai pas trop bien saisi le problème.
          (pour l'instant j'ai dans la tête un artefact -ce genre de problèmes vient très souvent d'une mauvaise utilisation des threads).
          • Partager sur Facebook
          • Partager sur Twitter
            15 février 2009 à 23:47:17

            Citation : orklah


            si c'est le cas je peux pas puisque j'ai justement des options qui me permettent de la faire disparaitre quand j'en ai besoin et de la mettre en icone dans le systray



            Ta fenetres est détruite ?ou reste en mémoire mais est cachée ?
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              16 février 2009 à 8:46:07

              salut
              ds le constructeur de la fenêtre qui disparait
              en tout cas comme il t'a dit elmh le problème reste flou , il nous faut qlq morceau de code
              • Partager sur Facebook
              • Partager sur Twitter
                16 février 2009 à 12:25:00

                Excusez, mon code va surement vous paraitre brouillon... mais c'est la premiere fois que je touche aux interfaces graphiques on a pas encore vu ca en cours

                Ma classe Lanceur avec mon main:
                public class Lanceur {
                
                	public static void main(String[] args) {
                		Fenetre Fen = new Fenetre();
                	}
                }
                


                Ma classe Fenetre

                public class Fenetre extends JFrame {
                	boolean discret = false;
                 
                        public Fenetre(){
                
                        	SimpleInput input = new SimpleInput();
                        	String login, password;
                
                        	login = input.getString("Entrer login");
                        	password = input.getString("Entrer password");
                        	
                        	final Panneau panneau = new Panneau(login, password);
                        	
                        	this.setTitle("");
                            this.setSize(450, 500);  
                
                            this.setContentPane(panneau);
                            
                            
                            this.setVisible(true);
                            while(true){
                            	try {
                					Thread.sleep(10000);
                					panneau.repaint();
                				} catch (InterruptedException e) {
                					JOptionPane.showMessageDialog(null, "Le programme a rencontre une erreur de type #0100");
                				}
                                
                            }
                
                        }
                        
                }
                



                Ma classe Panneau
                public class Panneau extends JPanel {
                	static String[] str = new String[15];
                	static String[] str2 = new String[15];
                	int x;
                	int y;
                	static int i = 0;
                	static String login;
                	static String password;
                	boolean discret = false;
                	static boolean first = true;
                    
                    public Panneau(String login, String password) {
                		Panneau.login = login;
                		Panneau.password = password;
                	}
                	public void paintComponent(Graphics g){
                
                		refresh();
                                   JOptionPane.showMessageDialog(null, "Fenetre de test");
                
                    	x=0;
                    	y=0;
                    	g.fillRect(0, 0, 10000, 10000);
                    	Font font = new Font("Arial", Font.BOLD, 15);
                        g.setFont(font);
                        g.setColor(Color.blue);  
                
                    	
                        
                    }
                    public static void refresh(){
                    	Fonctions f = new Fonctions();
                    }
                    public void setdiscret(boolean discr){
                    	this.discret = discr;
                    }
                }
                



                Voila j'ai enlevé la partie "contenu" car ca n'a plus rien a voir avec les fenetres mais si ces bouts de code ne suffisent pas je vous enverrais sa par MP
                sinon j'ai pas mis la classe Fonctions(c'est une classe avec deux methodes une pour recuperer une chaine de caracteres sur le net et l'autre pour decouper cette chaine en un tableau de String)

                Merci

                • Partager sur Facebook
                • Partager sur Twitter
                  16 février 2009 à 12:33:07

                  Le problème c'est qu'on peut pas compiler ton code et qu'on ne comprend pas où est le soucis.

                  Je vais quand même jeter un œil à ton code si j'trouve quelque chose mais bon.

                  [EDIT]
                  Euh c'est quoi ce while(true) ??????????
                  C'est vraiment très bizarre comme façon de faire une boucle infinie.
                  Tu repeins ta fenêtre tout le temps.

                  Citation : toi

                  g.fillRect(0, 0, 10000, 10000);


                  T'as un écran de 10.000 pixels de large ??????? J'espère que la méthode fillRect est bien foutue, qu'elle aille pas peindre ailleurs que sur l'écran XD
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 février 2009 à 13:13:17

                    :s comme je l'ai dit le code est brouillon ...

                    Euh c'est quoi ce while(true) ??????????

                    en fait je cherchais une solution pour faire une reactualisation toutes les 10 secondes
                    donc boucle infinie avec pause de 10 secondes . Vu que sa fonctionnait j'ai pas cherché si il y avait de meilleures facons de faire

                    Citation : toi
                    :p

                    T'as un écran de 10.000 pixels de large ?

                    j'aimerais :)
                    en réalité non mais comme je savais pas encore la taille definitive de ma fenetre j'ai prévu plus grand
                    mais bon le rectangle ne depasse pas de ma fenetre :)

                    je t'envoie le code en entier par MP
                    merci
                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 février 2009 à 13:15:55

                      ça risque de peindre sur le mur avec des dimension pareilles :D
                      et puis quoi elmh ? tu n'as pas encore achetté ton écrans 240 pouces ? à 20000 pixel de large ?


                      sinon tu as déjà essayé de ne plus rafréchir l'a jframe pendants que l'erreur apparait ?


                      Citation : Toi

                      mais bon le rectangle ne depasse pas de ma fenetre


                      hum ça tu n'en sais rien :s
                      grosso modo il n'affiche qu'une partie de la zone graphique que tu créé :s si ça tombe il créé un Graphics de 10000 pixel sur 10000 =/
                      vus que tu peux transformer les Graphics en image sans spécialement les afficher =/ ... =/
                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 février 2009 à 13:18:56

                        Okay pour la réactualisation, tu peux laisser ça comme ça si ça marche... (mais je suis persuadé que y'a une meilleure méthode, bien que je n'ai jamais cherché à faire cela).
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 février 2009 à 13:26:54

                          elmh en faite pour améliorer ta réactualisation :) c'est comme ça qu'il doit faire :)
                          mais dans un autre thread et plutôt que de faire while(true)
                          il doit faire
                          boolean toto =true;
                          while(toto)

                          comme ça en cas de problemes, il peut faire passer toto à false et la boucle se finis :) et il n'y a pas une boucle infinie qui continue a tourner demandant le rafraichissement d'une page qui n'existe plus par exemple :o
                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 février 2009 à 13:30:03

                            Oui c'est sur que pour le moment meme si on a pas de connection internet le programme continue de tourner dans le vide...
                            mais bon en principe on l'arrete...

                            Mais vu que j'ai pas encore commencé a bosser sur les thread... je vais laisser comme ca pour le moment.(au pire je rajouterais une condition avec un break a l'interieur de ma boucle
                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 février 2009 à 13:34:33

                              ben même si tu ne sais rie nsur les thread :) rie nne t'empêche de mettre un boolean à la place du "true" qui peux passer à false lors de la génération d'une erreur :o

                              je ne serais point étonné que le problème vienne du Sleep :o
                              je t'explique il attrape l'erreur puis reprend la boucle au début :o dnc il sleep ... donc il arrête d'afficher =/
                              :o
                              peut tu essayer de faire plutôt comme ça ?
                              try {
                                          while(true){
                                          	
                              					Thread.sleep(10000);
                              					panneau.repaint();
                              
                                              
                                          }
                              	} catch (InterruptedException e) {
                              					JOptionPane.showMessageDialog(null, "Le programme a rencontre une erreur de type #0100");
                              				}
                              

                              bien sur ici à la génération de l'erreur, tu quitte la boucle mais c'est juste pour voir si ton showmessage se comporte normalement quand tu fais ça ou pas :o
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                16 février 2009 à 13:46:18

                                salut!
                                je pense ce qui pose le problème c cette ligne de code au niveau de la class panneau
                                JOptionPane.showMessageDialog(null, "Fenetre de test");
                                


                                voila ce q j'ai obtenu avec un rectangle (0, 0, 100, 100), on éliminant bien sur la ligne précédente
                                Image utilisateur

                                sachant que j'ai exécuté le code avec cette boucle while (true) :)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  16 février 2009 à 13:51:48

                                  ben son probleme n'était pas l'affichage mais bien quand un message d'erreur survenait ?
                                  ou j'ai rien compris
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Anonyme
                                    16 février 2009 à 13:56:03

                                    chépa j'ai pensé que le problème c l'affichage
                                    il obtient tjrs une fenêtre transparente,
                                    et quand j'ai sup cette ligne j'ai bien vue la fenêtre
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      16 février 2009 à 13:58:23

                                      ben on l'a vois même sans supprimer ^^
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        16 février 2009 à 14:00:01

                                        t'as testé le code sans la supprimer?
                                        chez moi elle est transparente
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          16 février 2009 à 14:01:42

                                          En fait à chaque fois qu'il rencontre une erreur, il voudrait afficher une tite fenêtre (via le showMessageDialog) avec la référence de l'erreur.

                                          En fait le thread qui s'occupe d'afficher la fenêtre est occupé donc le contenu n'est jamais affiché.

                                          Moi là-dessus, je modifierais la fameuse boucle while(true)...
                                          Au moins en mettant une variable qui gère ça et qu'on puisse arrêter à tout moment (comme l'a dit snooopy finalement).
                                          Là tu demandes à la JFrame principale de se redessinner sans arrêt.
                                          Je suis pas très calé sur les threads, mais à mon avis, tu devrais créer un thread à part pour afficher les messages d'erreurs. Actuellement l'affichage est géré par l'Event Dispatch Thread si je ne me trompe pas, qui est déjà occupé à redessiner la JFrame. Enfin je me trompe peut-être sur qui fait quoi, mais le fond de l'erreur est là.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Anonyme
                                            16 février 2009 à 15:49:59

                                            maintenant je suis certaine que le problème n'était pas à cause de while

                                            Citation : elmh

                                            En fait à chaque fois qu'il rencontre une erreur, il voudrait afficher une tite fenêtre (via le showMessageDialog) avec la référence de l'erreur.



                                            et oui , il n'y a pas d'erreur ds le bloc try
                                            j'ai mis une division par zéro ds le bloc try et voila ce que j'ai obtenu
                                            Image utilisateur

                                            import javax.swing.JFrame;
                                            import javax.swing.JOptionPane;
                                            
                                            public class Fenetre extends JFrame {
                                            	boolean discret = false;
                                             
                                                    public Fenetre(){
                                            
                                                    	SimpleInput input = new SimpleInput();
                                                    	String login, password;
                                            
                                                    	login = input.getString("Entrer login");
                                                    	password = input.getString("Entrer password");
                                                    	
                                                    	final Panneau panneau = new Panneau(login, password);
                                                    	
                                                    	this.setTitle("");
                                                        this.setSize(450, 500);  
                                            
                                                        this.setContentPane(panneau);
                                                        
                                                        
                                                        this.setVisible(true);
                                                        while(true){
                                                        	 try { 
                                            					//Thread.sleep(1);
                                            					panneau.repaint();
                                            					int x=0;
                                            					int y;
                                            					y=8/x;
                                            				} catch (ArithmeticException e) {
                                            					JOptionPane.showMessageDialog(null, "Le programme a rencontre une erreur de type #0100");
                                            					System.out.print("div zéro");
                                            				}
                                                            
                                                        }
                                            
                                                    }
                                                    public static void main(String[] args) {
                                                		Fenetre Fen = new Fenetre();
                                                	}
                                              
                                            }
                                            

                                            import java.awt.Color;
                                            import java.awt.Font;
                                            
                                            import java.awt.Graphics;
                                            import java.io.FileReader;
                                            import java.io.IOException;
                                            
                                            import javax.swing.JOptionPane;
                                            import javax.swing.JPanel;
                                            
                                            public class Panneau extends JPanel {
                                            	static String[] str = new String[15];
                                            	static String[] str2 = new String[15];
                                            	int x;
                                            	int y;
                                            	JOptionPane b = new JOptionPane();
                                            	static int i = 0;
                                            	static String login;
                                            	static String password;
                                            	boolean discret = false;
                                            	static boolean first = true;
                                               
                                              public Panneau(String login, String password) {
                                            	  Panneau.login = login;
                                            		Panneau.password = password;
                                            	}
                                            	public void paintComponent(Graphics g){
                                            
                                            		//JOptionPane.showMessageDialog(null, "Fenetre de test");
                                            		
                                            
                                                	x=0;
                                                	y=0;
                                                	g.fillRect(0, 0, 100, 100);
                                                	Font font = new Font("Arial", Font.BOLD, 15);
                                                    g.setFont(font);
                                                    g.setColor(Color.blue);  
                                            
                                                	
                                                    
                                                }
                                               /* public static void refresh(){
                                                	Fonctions f = new Fonctions();
                                                }*/
                                                public void setdiscret(boolean discr){
                                                	this.discret = discr;
                                                }
                                            }
                                            

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              16 février 2009 à 16:04:58

                                              et qu'a tu changé alors ? pour que ça marche ?
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Anonyme
                                                16 février 2009 à 16:17:54

                                                Snooooopy revois mes anciens messages
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  16 février 2009 à 16:27:37

                                                  woups excuse moi :s
                                                  j'ai crus que tu avais trouvé d'ou venait le problème :s
                                                  c'est donc dans un autre bloc try catch =/

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Anonyme
                                                    16 février 2009 à 16:34:33

                                                    Snooooopy le problème vient de

                                                    Citation : nanona


                                                    salut!
                                                    je pense ce qui pose le problème c cette ligne de code au niveau de la class panneau

                                                    JOptionPane.showMessageDialog(null, "Fenetre de test");
                                                    



                                                    et non pas de la boucle while
                                                    j'ai modifié le bloc try catch juste pour prouver que le problème n'était pas ds la boucle while
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      16 février 2009 à 16:40:22

                                                      JOptionPane.showMessageDialog(null, "Fenetre de test");

                                                      Cette ligne je l'ai rajoutée car en enlevant le contenu j'avais enlevé les autres
                                                      mais a chaque fois que j'utilise cette fonction le MessageDialog devient "transparent" et l'autre fenetre bloque en attendant que j'ai pas validé celui la.

                                                      Et il n'y aurait pas une autre fonction simple pour afficher une popup d'erreur sans avoir de conflit?
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                      Anonyme
                                                        16 février 2009 à 16:48:12

                                                        ton travail est juste, il marche très bien chez moi
                                                        en tt cas ,je te propose qlq chose tu affiches une autre p'tit fenetre contient un JLabel dont le contenu est le message d'erreur
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          17 février 2009 à 9:48:26

                                                          Je vois que le sujet persiste, ça m'intéresse :p

                                                          A mon avis, tu dis à ton panneau de se réactualisé, puis tu met dedans une fenêtre bloquante qui empêche le "repaint()" de finir sa tâche, donc de finir l'affichage.

                                                          Il me semble (arrêtez moi si je me trompe) qu'un repaint, c'est la suppression de tous les éléments de la fenêtre (y compris les éléments par défaut tel que le background) puis l'affichage de tous ces éléments avec leurs états actuels.

                                                          Si tu enlève ton JOptionPane, ça marche car le "repaint()" n'est pas interrompu.

                                                          Pour contourner le problème, soit tu fais tes test en amont, c'est à dire avant d'appeler ton repaint(), soit tu affiche ton message après le repaint() selon ce que tu as besoin de faire.
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            17 février 2009 à 13:19:34

                                                            L'inconvenient c'est justement que le message d'erreur ou notification a besoin de se retrouver en meme temps que le repaint.
                                                            En cas de notification on informe le joueur d'un evenement mais le logiciel doit continuer a tourner derriere
                                                            et en cas d'eereur il faut que le logiciel reesaye plusieurs fois...

                                                            EN tout cas je pense que je vais reprendre le projet depuis le debut pour mieux l'organiser...
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              17 février 2009 à 13:43:19

                                                              Sinon c'est peut être lourd, mais tu peux surement lancer un thread qui affichera ton message et qui sera donc indépendant.
                                                              Mais si ton truc doit tourner derrière, a mon avis regarde du côté des thread.
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              [bug] fenetre transparente

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown