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

AWT/Swing Java Discussion :

Réduction de la fenêtre dans le "systray"


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Par défaut Réduction de la fenêtre dans le "systray"
    Bonjour,

    Je suis confronté à un problème depuis 2 jours et je n'ai toujours pas trouvé la solution qui me satisfasse malgré de nombreuses recherches:

    Ce que eux faire est, à priori, assez simple!

    Je souhaiterai que, lorsque l'on clique sur le symbole réduire de la fenêtre, celle-ci "disparaisse" de la barre de menu (celle dans laquelle apparaissent toutes les applis réduites: firefox, notepad...) mais qu'un icône apparaissent près de l'horloge ("systray" si j'ai bien compris)

    Ce que j'ai réussi à faire pour l'instant:
    Lorsque je clique sur le bouton réduire (en haut à droite de ma fenêtre), celle-ci se réduit dans la barre de menu (heureusement! ) et dans le même temps, un icône apparait dans le systray.

    Cet icône est personnalisé. Le nom de mon appli apparait si je passe la souris dessus.
    Un clic droit me permet d'afficher ou de quitter l'appli.
    A noter que si l'appli est réduite dans la barre de menu, la fonction afficher ne fonctionne pas!

    Il y a donc certainement un truc que j'ai oublié ou que ne fais pas bien mais je ne vois pas quoi.

    Si vous avez des idées et des suggestions, je suis preneur!

    Je vous donne mon code pour vous montrer ce que j'ai fait:

    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
     
    ...
    cadre = new JFrame(Messages.getString("vuePrincipale.0"));
    cadre.addWindowListener(this);
    ...
    ...
    	@Override
    	public void windowDeactivated(WindowEvent arg0) {
    	}
     
    	@Override
    	public void windowDeiconified(WindowEvent arg0) {
    		 System.out.println("icone en fenetre");
    	}
     
    	@Override
    	public void windowIconified(WindowEvent arg0) {
    		//cadre.setExtendedState(cadre.ICONIFIED);
    		System.out.println("fentre en icone");
    		iconTray();
    	}
     
    	@Override
    	public void windowOpened(WindowEvent arg0) {
    	}
     
    	public void setTextArea(JTextArea textArea) {
    		this.textArea = textArea;
    	}
     
    	public static JTextArea getTextArea() {
    		return textArea;
    	}
     
     
     
    ...
     
     
    	private void iconTray() {
    		if (SystemTray.isSupported()) {
    			System.out.println("SysTray supported");
    			// construction du menu et gestion des événements
    			PopupMenu popup = new PopupMenu();
    			MenuItem démarrer = new MenuItem("Afficher");
    			MenuItem quitter = new MenuItem("Quitter");
    			ActionListener afficher = new ActionListener() {
    				public void actionPerformed(ActionEvent e) {
    					cadre.setVisible(true);
    				}
    			};
    			ActionListener arrêter = new ActionListener() {
    				public void actionPerformed(ActionEvent e) {
    					try {
    						tray.displayMessage("Arrêt de l'application XXXXXXXX",
    								"A bientôt", TrayIcon.MessageType.INFO);
    						Thread.sleep(4000);
    					} catch (InterruptedException ex) {
    					} finally {
    						System.exit(0);
    					}
    				}
    			};
    			démarrer.addActionListener(afficher);
    			quitter.addActionListener(arrêter);
    			popup.add(démarrer);
    			popup.add(quitter);
    			// création de l'icône
    			Image icone = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/util/enveloppe.png"));// Si l'image est dans le jar //$NON-NLS-1$
    			tray = new TrayIcon(icone,"XXXXXXX", popup);
    			System.out.println("Affichage de l'icone");
    			tray.setImageAutoSize(true);
    			tray.addActionListener(afficher);
    			// placement de l'icône dans la barre de tâche
    			try {
    				SystemTray.getSystemTray().add(tray);
    			} catch (AWTException ex) {
    			}
    		}
    	}

    Merci d'avance pour votre aide!

    @+

    Thomas.

  2. #2
    Membre très actif
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Par défaut
    Bonjour,

    Si tu veux modifier ré-afficher une fenêtre réduite dans la barre des tâches tu peux utiliser Frame.setExtendedState

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Par défaut Ca marche!
    Merci pour le tuyau!

    Après avoir galéré 15 min et ajouté des bouts de codes un peu partout, j'ai réussi à faire ce que je veux:
    - quand je réduis ma fenêtre, elle n'apparait plus dans la barre de menu et se met dans le systray.
    - A partir du systray, qd je choisis "afficher", ma fenêtre réapparait.

    C'est trop cool!

    Je dépose le code complété pour ceux qui seraient intéressés. Si vous y voyez des améliorations possibles, je suis preneur car là, j'ai un peu l'impression d'avoir fait du bricolage!

    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
    ...
            @Override
    	public void windowDeiconified(WindowEvent arg0) {
    		cadre.setExtendedState(Frame.NORMAL);
    		System.out.println("icone en fenetre");
    	}
    
    	@Override
    	public void windowIconified(WindowEvent arg0) {
    		cadre.setExtendedState(Frame.ICONIFIED);
    		cadre.setVisible(false);
    		System.out.println("fentre en icone");
    		iconTray();
    	}
    
    ...
    
    private void iconTray() {
    		if (SystemTray.isSupported()) {
    			System.out.println("SysTray supported");
    			// construction du menu et gestion des événements
    			PopupMenu popup = new PopupMenu();
    			MenuItem démarrer = new MenuItem("Afficher");
    			MenuItem quitter = new MenuItem("Quitter");
    			ActionListener afficher = new ActionListener() {
    				public void actionPerformed(ActionEvent e) {
    					cadre.setVisible(true);
    					cadre.setExtendedState(Frame.NORMAL);
    					
    				}
    			};
    			ActionListener arrêter = new ActionListener() {
    				public void actionPerformed(ActionEvent e) {
    					try {
    						tray.displayMessage("Arrêt de l'application XXXXXXX",
    								"A bientôt", TrayIcon.MessageType.INFO);
    						Thread.sleep(4000);
    					} catch (InterruptedException ex) {
    					} finally {
    						System.exit(0);
    					}
    				}
    			};
    			démarrer.addActionListener(afficher);
    			quitter.addActionListener(arrêter);
    			popup.add(démarrer);
    			popup.add(quitter);
    			// création de l'icône
    			Image icone = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/util/enveloppe.png"));// Si l'image est dans le jar //$NON-NLS-1$
    			tray = new TrayIcon(icone,"XXXXXX", popup);
    			System.out.println("Affichage de l'icone");
    			tray.setImageAutoSize(true);
    			tray.addActionListener(afficher);
    			// placement de l'icône dans la barre de tâche
    			try {
    				SystemTray.getSystemTray().add(tray);
    			} catch (AWTException ex) {
    			}
    		}
    	}
    Merci pour votre aide et à bientôt!

    Thomas.

  4. #4
    Membre très actif
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Par défaut
    Citation Envoyé par Supersonik Voir le message
    Si vous y voyez des améliorations possibles, je suis preneur car là, j'ai un peu l'impression d'avoir fait du bricolage!
    Tu peux récupérer la valeur de "extendedState" avant d'iconifier ta fenêtre pour la restaurer ensuite au lieu de toujours utiliser NORMAL.

    Comme ça si l'utilisateur veut une fenêtre maximisée, il n'aura pas le faire chaque fois que la fenêtre est désiconifiée.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Par défaut
    Effectivement, c'est une bonne idée.
    Dans mon cas particulier, je ne vais pas le faire car la fenêtre n'est pas redimensionnable...

    Par contre, avec le code que j'ai déposé, je me suis aperçu en faisant tester à un collègue, qu'à chaque fois qu'on réduisait la fenêtre (il s'est amusé à ouvrir et réduire plusieurs fois d'affilée la fenêtre), un icône se créait se créait dans le systray. C'est balot!

    J'essaie de résoudre ce problème en ce moment...

  6. #6
    Membre très actif
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Par défaut
    Rien de sorcier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SystemTray.getSystemTray().remove(tray);

  7. #7
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Par défaut
    Bonjour,

    Je viens seulement de lire le message précédent après un bon petit weekend prolongé!

    Effectivement, l'ajout de la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SystemTray.getSystemTray().remove(tray);
    suffit à résoudre ce problème.

    C'est cool, la semaine commence bien!

    Bon courage à tous et merci!

    @+

    Thomas.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/07/2011, 19h39

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