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 :

Bouton + menu


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Points : 46
    Points
    46
    Par défaut Bouton + menu
    Bonjour à tous !

    Je galère sur un problème qui peut sembler simple mais que je n'arrive pas à résoudre.
    Je souhaiterais avoir un composant qui me permet lorsque je clic sur un bouton d'afficher une liste en dessous. En gros comme un JCombobox mais sans le textfield devant le bouton. Dans Netbeans, cela existe voir ici :

    Comment faire?
    J'ai bien essayé de me faire une classe qui hérite de JButton, et lors d'un clic afficher un JPopupMenu, mais le soucis est que lorsque je clic autre part que sur le popupmenu, il disparait. Du coup, lorsque je clic une fois sur le bouton le popupmenu s'affiche, et lorsque je clic une deuxième fois, le popupmenu disparait (car je ne lui clic pas dessus) et l'action du bouton me le réaffiche . Autrement dit chaque clic sur le bouton me réaffiche le popupmenu. La seule façon de m'en débarrasser est de cliquer ailleurs (pas terrible).

    Un jcombox, lui se comporte bien :
    -un clic : la liste s'affiche
    -un deuxième : la liste disparait
    -un clic en dehors du jcombobox, la liste disparait

    et c'est ce que je souhaiterais, mais en n'ayant qu'un bouton et pas un textfield suivis d'un bouton

    en gros : pas ça :

    mais ça :

    Si quelqu'un a une idée

    Merci !

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    bah un JButton plus un JPopupMenu feront l'affaire

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Points : 46
    Points
    46
    Par défaut
    euh j'ai écrit dans mon message que j'ai essayé mais pleins de problèmes se posent avec cette méthode car lorsque le popup est affiché et que l'on clic à côté (jbutton ou autre), le popupmenu disparait de lui-même. Du coup, lorsque je clique sur le jbutton alors que le popupmenu est affiché, le jbutton détecte le jpopupmenu non affiché et le réaffiche. En gros quelque soit le cas de figure, un clic sur le jbutton affiche le popupmenu. Or, je souhaiterais faire :
    -un clic afficher
    -un second clic le fait disparaitre

  4. #4
    Membre émérite
    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
    Points : 2 582
    Points
    2 582
    Par défaut
    Peut être en utilisant un JComboBox équipé d'un ComboBoxEditor qui n'édite rien et qui est transparent ?

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Points : 46
    Points
    46
    Par défaut
    c'est une piste mais je ne vois pas comment faire . As-tu une idée plus précise?

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 856
    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 856
    Points : 22 885
    Points
    22 885
    Billets dans le blog
    51
    Par défaut
    Un JToggleButton et une JWindow ?

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 136
    Points : 132
    Points
    132
    Par défaut Bonjour,
    Ton idée avec le JPopupMenu et le JButton semble bien.
    Il suffit juste que tu controle un peu plus les réactions du ton popup.
    Genre quand tu cliques la deuxième fois sur ton bouton, tu bloque l'affichage du JPopMenu. Un bon listener et un petit booleen feront l'affaire je pense.

    Cordialement

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Points : 46
    Points
    46
    Par défaut
    Salut et tout d'abord merci pour les réponses.

    J'ai abandonné l'idée de faire un bouton + popupmenu qui a exactement le même comportement qu'un combobox. Ce que j'ai codé est suffisant tant pis :
    - un clic sur le bouton = affichage du popup (même si déjà affiché)
    - un clic autre part que sur le popup (affiché) le fait disparaitre.

    Je n'ai vraiment pas trouvé d'autres solutions avec jbutton (ou toggle) + jpopupmenu (même avec des boolean etc...) , je dois certainement passer à côté d'une fonction qui me permettrait de le faire.

    Je n'ai pas eu le temps de me pencher sur la combinaison bouton+jwindow. Si j'ai le temps je testerais ça.

    Encore merci !

  9. #9
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 617
    Points : 15 680
    Points
    15 680
    Par défaut
    euh j'ai écrit dans mon message que j'ai essayé mais pleins de problèmes se posent avec cette méthode car lorsque le popup est affiché et que l'on clic à côté (jbutton ou autre), le popupmenu disparait de lui-même. Du coup, lorsque je clique sur le jbutton alors que le popupmenu est affiché, le jbutton détecte le jpopupmenu non affiché et le réaffiche. En gros quelque soit le cas de figure, un clic sur le jbutton affiche le popupmenu.
    J'avais eu exactement ce problème il y a un moment a mon ancien boulot. Je n'ai maheureusement plus le code a disposition.
    J'avais galéré un peu mais je m'en était tiré avec un JButton qui faisait apparaitre un JPopupMenu contenant une JList. J'avais du faire quelque petits bricolages tordus pour arriver au comportement que tu décris, mais j'y étais arrivé.

  10. #10
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par Uther Voir le message
    J'avais eu exactement ce problème il y a un moment a mon ancien boulot. Je n'ai maheureusement plus le code a disposition.
    J'avais galéré un peu mais je m'en était tiré avec un JButton qui faisait apparaitre un JPopupMenu contenant une JList. J'avais du faire quelque petits bricolages tordus pour arriver au comportement que tu décris, mais j'y étais arrivé.

    chuis sur qu'il y a moyen que tu récupère ton code

  11. #11
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 617
    Points : 15 680
    Points
    15 680
    Par défaut
    Désolé mais c'est pas possible. Je me souviens que c'est faisable avec JButton+JPopupMenu+JList moyenant quelques bidouilles, mais je n'ai plus le code exact.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 82
    Points : 52
    Points
    52
    Par défaut
    moi je me pose une petite question de structure de programme sur un projet quelque peu similaire.

    Je m'explique, je souhaite faire en sorte que lorsque l'utilisateur clique sur un bouton contenu dans une JInternalFrame, cela fasse apparaitre un menu contenu un tableau de caracteres speciaux (un peu comme word en fait).

    J'ai créé pour ca une classe spéciale de bouton, qui instancie un JPanel contenant (pour l'instant, un JLabel).

    Ma question est simple et pourtant fondamentale, comment faire savoir à mon InternalFrame, située dans un autre fichier, que je souhaite lui ajouter ce JPanel afin de l'afficher ?

    J'ai essayé la solution du JWindow, mais ca ne me convient pas pourqu'il apparait hors de la fenetre de mon application ...

    Ou bien j'ai loupé quelque chose ?

    Merci pour vos lumières

  13. #13
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Points : 46
    Points
    46
    Par défaut
    Si j'ai bien compris ta question, il y a une technique basique qui consiste à faire connaître la JInternalFrame à ton bouton personnalisé, dans le constructeur du bouton (passer en paramètre la jinternalframe) par exemple. Ainsi, dans ta classe du bouton, tu peux appeler n'importe quelle méthode(public ou private si dans le même package je crois) sur ta jinternalframe .

    L'autre solution possible est de mettre ta classe de bouton personnalisé en classe interne de ta jinternalframe et ainsi tu y accederas directement.

    J'espère avoir cerner ta question et y avoir répondu

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 82
    Points : 52
    Points
    52
    Par défaut
    C'est exactement ca, j'ai procédé ainsi pour un bouton qui avait une action sur un JTextPane (passé en argument du bouton), mais je n'étais pas sur que ce soit une "best practice"

    pour les classes internes, je l'ai fais parfois, mais l'application devient vraiment trop fouilli en procédant de cette manière, c'est pourquoi je cherche à découper tout ca !

    Merci pour ta réponse et bonnes fêtes de fin d'année !

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 82
    Points : 52
    Points
    52
    Par défaut
    Hmm il a pas l'air d'aimer quand meme ...
    Le JPanel est il bien la bonne solution pour contenir ce genre d'informations ?

    Quand je l'ajoute a ma JInternalFrame, il prend la place du JPanel destiné à recevoir mes applications, et ne respecte pas la taille que je lui ai configuré.
    On ne peut pas mettre deux JPanel dans une meme InternalFrame ?
    Ou alors je dois l'ajouter à l'autre JPanel et pas a la Frame elle meme ?

    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
    public class ChoixMenuBalisageButton extends BalisageButton implements MouseListener{
     
    	JInternalFrame frame;
    	JPanel fenetreDeChoix;
     
    	public ChoixMenuBalisageButton(Action act, String tip, String[] Balise, JTextPane editeurTextActif, JInternalFrame frame) {
    		super(act, tip, Balise, editeurTextActif);
    		this.frame = frame;
    		System.out.println("On est dans le constructeur du bouton");
    		fenetreDeChoix = getMenuChoix(10, 10);
    		frame.getContentPane().add(fenetreDeChoix);
    	}
     
    	  public void mouseClicked(MouseEvent e) {
    		  fenetreDeChoix.setVisible(true);		  
     
    	  }
     
    	  private JPanel getMenuChoix(int x, int y){
    		  final JPanel fenetreDeChoix = new JPanel();
    		  fenetreDeChoix.setBounds(x, y, 24, 48);
    		  fenetreDeChoix.setMinimumSize(new Dimension(24,48));
    		  fenetreDeChoix.setPreferredSize(new Dimension(24,48));
    		  fenetreDeChoix.setMaximumSize(new Dimension(24,48));
    		  fenetreDeChoix.setSize(new Dimension(24,48));
    		  fenetreDeChoix.setBackground(Color.BLUE);
    		  fenetreDeChoix.setVisible(false);
     
    		  JLabel blackLine = new JLabel("encre noire");
    		  blackLine.setText("encre noire");
    		  blackLine.setBounds(0,0, 20, 10);
    		  blackLine.setVisible(true);
    		  blackLine.addMouseListener(new MouseAdapter() {
    				public void mouseClicked(MouseEvent mouseClicked) {
    					setBalise(ConstBalise.BLACK);
    					doBalisage(editeurTextActif, Balise);
    					fenetreDeChoix.setVisible(false);
    				}
    			}); // Fin addMouseListener
    		  fenetreDeChoix.add(blackLine);
     
    		  return fenetreDeChoix;
    	  }
    }

  16. #16
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Points : 46
    Points
    46
    Par défaut
    je ne connais pas trop jinternalframe (je vois ce que ça fait mais je ne l'ai jamais utilisé).
    Comme bon nombre de composant graphique, tu peux lui attribuer un layoutmanager. Pourquoi ne pas essayer de lui mettre un borderlayout par exemple, et ton nouveau panel, tu le met dans une zone libre du borderlayout.

    N'oublie pas que comme pour les jframe, le jinternalframe contient container (accessible via getcontentpane) et que c'est dans ce container que tu dois ajouter tes panel perso.
    Met un layout à la jinternalframe ça devrais résoudre ton problème. Attention cependant, une bidouille sera surement nécessaire, car certains layout aggrandissent les éléments qu'ils contiennt, et donc ton panel que tu souhaite ajouter.

  17. #17
    Membre éclairé Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Points : 695
    Points
    695
    Par défaut
    Je sais pas si ça peut t'aider, mais voilà un lien : un bouton + JPopupMenu

    ce blog regorge d'astuces Swing forts interressentes

  18. #18
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 121
    Points : 46
    Points
    46
    Par défaut
    Merci ! c'est plus ou moins ce que j'ai fait

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 82
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par bassim Voir le message
    Je sais pas si ça peut t'aider, mais voilà un lien : un bouton + JPopupMenu

    ce blog regorge d'astuces Swing forts interressentes
    Un lien très intéressant merci !

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 82
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par lamoua76 Voir le message
    je ne connais pas trop jinternalframe (je vois ce que ça fait mais je ne l'ai jamais utilisé).
    Comme bon nombre de composant graphique, tu peux lui attribuer un layoutmanager. Pourquoi ne pas essayer de lui mettre un borderlayout par exemple, et ton nouveau panel, tu le met dans une zone libre du borderlayout.

    N'oublie pas que comme pour les jframe, le jinternalframe contient container (accessible via getcontentpane) et que c'est dans ce container que tu dois ajouter tes panel perso.
    Met un layout à la jinternalframe ça devrais résoudre ton problème. Attention cependant, une bidouille sera surement nécessaire, car certains layout aggrandissent les éléments qu'ils contiennt, et donc ton panel que tu souhaite ajouter.

    Merci je vais jeter un oeil pour les layouts, je ne les utilise pas du tout pour le moment en effet

Discussions similaires

  1. Bouton menu, charger un clip
    Par bjacque2 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 17/04/2008, 08h37
  2. Gtk2 - Bouton / Menu grisés
    Par Tiblond dans le forum Interfaces Graphiques
    Réponses: 0
    Dernier message: 05/03/2008, 18h45
  3. [HTML] Pb bouton menu actif (a:active)
    Par hkiller dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 01/11/2007, 12h04
  4. bouton + menu contextuel ?
    Par lex13 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 10/07/2007, 17h39
  5. Boutons menu en flash
    Par despe59 dans le forum Flash
    Réponses: 11
    Dernier message: 22/06/2006, 13h18

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