Bonjour!
Voilà je vais rapidement vous expliquer ce que je dois faire (projet pour une entreprise), vous dire les solutions que j'ai choisi, et vous demandez ce que vous en pensez.
Je précise tout de même que je connais relativement bien le Java en général, mais je n'y connais pas grand chose en GUI (que ce soit java ou autre).
Avant d'aller plus loin, je tiens à vous dire que ce projet est à rendre mi juin donc si vous avez des idées, même si vous n'avez pas tout lu, merci de me les présenter!
Mon but est donc de créer une interface permettant à des enfants d'utiliser facilement windows XP.
Je dois donc créer une sorte de "volet" à droite de l'écran un peu comme celui de vista, se masquant automatiquement.
Ensuite, à l'intérieur je dois placer des boutons décorés avec des images. Ces boutons donneront accès à un sous menu (d'autres boutons) qui eux seront des lanceurs d'applications.
Voici comment j'ai procédé :
Ma fenêtre principale est un JDialog (déjà je sens arriver les remarques).
Pourquoi ce choix? parce que c'est la seule classe que j'ai trouvé ne créant pas d'entrée dans la barre des tâches.
J'implèmente MouseListener pour savoir si la souris est bien dans la fenêtre (là aussi je sais pas si c'est la meilleure solution, sachant que quand la souris sera par exemple sur un des boutons elle ne sera plus considérée comme étant dans mon JDialog).
Code : Sélectionner tout - Visualiser dans une fenêtre à part public class KidsGUI extends JDialog implements MouseListener
Ma JDialog est configuré comme celà :
REALWIDTH est la largeur totale de mon volet (100px), WIDTH la largeur de la partie avec les boutons (90px) il y a donc 10px de marge, c'est cette partie qui dépassera lorsque le volet sera "replié", et qui permettra de capturer les évènements pour le refaire apparaitre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // On empêche la fermeture de la fenêtre Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); // On récupère les dimensions de l'écran (sa résolution) this.setSize(REALWIDTH, screenSize.height - WINTASKBARSIZE); // On donne une taille à notre fenêtre this.setLocation((screenSize.width - REALWIDTH), 0); // On place notre fenêtre tout à gauche this.setResizable(false); // On empêche le redimenssionner this.setUndecorated(true); // On retire la bordure this.setAlwaysOnTop(true); // On bloque la fenêtre au premier plan this.addMouseListener(this); // MouseListener this.setVisible(true); // On affiche notre fenêtre
Voici les méthodes provenant de l'interface MouseListener de ma classe KidsGUI :
Le replie du volet se passe donc dans un thread. Si hidding repasser à "false" à un moment donné le thread sera au courant et arrêtera le processus.
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 public void mouseEntered(MouseEvent e) { if(hidding) { hidding = false; // Interrompt le thread HiddingThread } setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - REALWIDTH), 0); } public void mouseExited(MouseEvent e) { if(!hidding) { hide(); } }
Pour cacher le volet je ne fait que changer la position de mon JDialog afin qu'il ne reste que 10px de visible.
Passons au contenu!
Jusque là tout marchait parfaitement (donc côté fonctionnel OK) même si je ne suis pas sûr de la pertinence de la partie technique.
Comme je l'a expliqué plus haut, je dois afficher un "menu principal" sous forme de bouton.
J'ai donc un JPanel sans layout (this.setLayout(null)dans lequel je dispose mes JButton.
Voici les options de mes JButton :
ficon est une image .png en mémoire. Ça marche comme il faut.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 this.setOpaque(false); this.setPreferredSize(new Dimension(KidsGUI.WIDTH, KidsGUI.WIDTH)); this.setIcon(ficon); //this.setRolloverIcon(aicon); this.addMouseListener(this); this.addActionListener(this);
aicon (pour le rollover) est un gif animé, ça marche bien dans le sens où quand la souris arrive sur le bouton le gif démarre (comme il faut avec l'animation) mais quand elle quitte le boutons le gif animé reste et l'animation se fige (j'aimerai au lieu de ça que ficon soit affiché).
J'utilise MouseListener pour remplir un boolean mouseIn de cette manière:
Pour que lorsque le MouseListener de mon JDialog perd la souris (MouseExited) je parcours tous mes boutons pour savoir si elle n'est pas toujours sur le volet (là aussi c'est pas très beau côté code).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public void mouseEntered(MouseEvent e) { mouseIn = true; } public void mouseExited(MouseEvent e) { mouseIn = false; }
Il existe donc plusieurs JPanel avec d'autres boutons et ce qu'il faudrait c'est que lorsqu'un bouton est cliqué je capture l'évenement avec actionPerformed et que je fasse une action au choix (executer un programme externe ou aller dans un des sous menu).
Pour switcher de sous menu, je pensais pouvoir simplement remplacer le JPanel de ma JDialog, mais ça ne fonctionne pas.
Voilà, je pense avoir à peu près tout dit, sinon le positionnement est absolu, je n'utilise pas de layout.
À savoir que je me suis un peu renseigné pour le remplacement de JPanel, j'ai essayé différentes techniques trouvées ici : http://www.developpez.net/forums/d29...jpanel-jframe/ et qu'aucune n'a marché (mes boutons du JPanel principal restait inchangé et l'interface freezait).
Aussi je tiens à préciser que je ne sais pas trop comment fonctionne tout ce qui est mise à jour des composants (je pense à quelques méthodes que j'ai pu voir comme revalidate(), update(), updateUI(), pack(), etc).
J'attends des avis, merci!
EDIT :
J'oubliais de préciser : Je développe sous Linux (gentoo) avec Eclipse, et je teste le tout dans une machine virtuelle.
Voici un screen :
![]()
Partager