Salut,
Je fais une petite application swing qui possède un icon tray.
Je cherche à reproduire le comportement que l'on voit sur pas mal de programmes qui en ont, c'est à dire :
- dés qu'on le réduit, la fenêtre disparaît.
- si on double clique sur l'icon tray, la fenêtre apparaît ou disparaît.
Pour arriver à faire ceci, j'ai mis
Puis dans mon événement de double clique sur l'icon tray, j'ai ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public void windowDeiconified(WindowEvent e) { toFront(); } public void windowIconified(WindowEvent e) { setVisible(false); }
Ça marche exactement comme je le veux sur windows. Cependant sur linux (enfin sur Ubuntu exactement), j'ai des comportements assez surprenant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 if (JFrame.ICONIFIED == getExtendedState()) { if(!isVisible()) setVisible(true); setExtendedState(m_OldState); } else { m_OldState = getExtendedState(); setExtendedState(JFrame.ICONIFIED); }
Lorsque la fenêtre disparaît, le premier double clique sur l'icon tray va faire réapparaître la fenêtre mais la laissera minimiser (et encore des fois, il ne se passe rien). Le second double clique ramènera la fenêtre au premier plan et en état JFrame.NORMAL (ou l'état dans lequel elle était avant).
Il m'a semblé que la setExtendedState(m_OldState) n'était pas pris en compte. J'ai fait des vérifications m_OldState est toujours égale à JFrame.NORMAL. Pour corriger le problème, j'ai rajouté ceci :
Même si c'est du rafistolage, ça fait bien mieux marcher le mécanisme mais... Ce n'est toujours pas ça : j'ai toujours des cas où la fenêtre redevient visible mais en état iconifié.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 while (ClientFrame.This().getExtendedState() != m_OldState) ClientFrame.This().setExtendedState(m_OldState); // Oui c'est pas bô...
Donc là je comprends vraiment pas pourquoi il se comporte de cette façon... Est-ce que quelqu'un pourrait m'éclairer ?
Merci ^^
Partager