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 :

GUI assez particulière


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 224
    Par défaut GUI assez particulière
    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.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class KidsGUI extends JDialog implements MouseListener
    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).

    Ma JDialog est configuré comme celà :

    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
    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.

    Voici les méthodes provenant de l'interface MouseListener de ma classe KidsGUI :

    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();
    		}
    	}
    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.

    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 :

    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);
    ficon est une image .png en mémoire. Ça marche comme il faut.
    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:

    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;
    	}
    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).

    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 :

  2. #2
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    1. Pourrais-tu mettre un image plus petite STP ?
    2. Si je comprends bien, tu n'arrives pas à switcher de panel, pourtant les techniques données dans la discussion que tu donnes en lien fonctionne (en tout cas la mienne ) pourrais-tu faire une mini-appli, indepandante de ton appli, en un seul fichier qui compile pour la mettre en oeuvre et si tu y arrives pas nous donner ton code ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 224
    Par défaut
    Oops, désolé pour l'image, je ne m'en étais pas rendu compte, c'est corrigé.
    Je ne voulais pas montrer tout le code pour ne pas être trop lourd, mais je vais le rendre plus léger et vous le rendre accessible.

    Je laisse 4 classes :

    KidsGUI : Mon JDialog
    MediaJPanel : Contiendra les JButton
    MediaJButton : Les JButton en question
    HiddingThread : Le thread se chargeant de masquer le JDialog

    Les sources sont disponibles ici : http://82.224.80.113/KidsGUI/

    Merci

    EDIT : je vous avais parlé d'un soucis avec le rollover sur les boutons, finalement ça marche comme il faut (en nettoyant un peu le code...) j'ai retiré cette partie des sources simplifiées

  4. #4
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Il ne s'agit pas seulement de nous rendre le code accessible, mais d'isoler les problèmes les uns des autres. Si tu n'as pas cette démarche, il nous est plus difficile de t'aider.

    L'idée est donc d'écrire spécialement un code maquette pour vérifier telle ou telle fonction, pour voir comment tu l'as comprise et comment tu l'as mets en oeuvre, cette fonction étant placée dans un cadre autonome. Par exemple, ici, un mini jframe qui commute ses jpanels sur appui d'un bouton : cela a été fait des milliers de fois, il n'y a pas de raison que tu n'y arrives pas non plus, et une fois que tu sauras le faire dans un contexte hyper simple, alors tu auras plus de chance d'y arriver dans le contexte de ton appli.

    Et surtout, c'est une façon pour toi de te former.

    Cordialement.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 224
    Par défaut
    Bonsoir!

    Merci encore pour ta réponse!

    J'ai encore un peu fouillé et j'ai enfin trouvé le problème
    J'interpretais mal le problème, l'interface n'était pas freezée, le jpanl était bien mis en place mais la jdialog n'étais pas rafraichit comme il faut. J'ai donc trouvé mon bonheur avec la méthode repaint de jdialog. Je fais un appel à repaint après le changement de jpanel et ça fonctionne comme il faut!

    Voilà je met donc mon sujet en resolu, merci encore pour votre aide!

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 897
    Billets dans le blog
    54
    Par défaut
    Pour mettre en resolu il faut cliquer sur le bouton qui se trouve en bas de page.

    EDIT - je l'ai fait pour toi.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

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

Discussions similaires

  1. Fonction somme assez particulière
    Par mdimagho dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 15/07/2014, 16h50
  2. [Struts2] Afficher une map assez particulière
    Par Overcrash dans le forum Struts 1
    Réponses: 2
    Dernier message: 28/02/2012, 09h32
  3. GUI - Shoes assez complet ?
    Par oxyaxion dans le forum Ruby
    Réponses: 2
    Dernier message: 02/02/2012, 15h25
  4. [SQL] Requête assez particulière
    Par rems033 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 14/06/2008, 15h37
  5. Premiers pas : est-il possible de configurer Joomla de facon assez particulière..
    Par boubinet dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 14/05/2007, 19h20

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