Je crée actuellement un menu contextuel clic droit en instanciant un nouveau JMenu
clic droit et en définissant son emplacement sur celui de la position de la souris ... Y a-t-il un meilleur moyen?
la source
Je crée actuellement un menu contextuel clic droit en instanciant un nouveau JMenu
clic droit et en définissant son emplacement sur celui de la position de la souris ... Y a-t-il un meilleur moyen?
Vous appelez probablement manuellement setVisible(true)
sur le menu. Cela peut provoquer un comportement de buggy désagréable dans le menu.
La show(Component, int x, int x)
méthode gère toutes les choses dont vous avez besoin (surligner les choses au survol de la souris et fermer la fenêtre contextuelle si nécessaire) où l'utilisation setVisible(true)
montre simplement le menu sans ajouter de comportement supplémentaire.
Pour créer un menu contextuel clic droit, créez simplement un fichier JPopupMenu
.
class PopUpDemo extends JPopupMenu {
JMenuItem anItem;
public PopUpDemo() {
anItem = new JMenuItem("Click Me!");
add(anItem);
}
}
Ensuite, tout ce que vous avez à faire est d'ajouter une personnalisation MouseListener
aux composants pour lesquels vous souhaitez que le menu apparaisse.
class PopClickListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger())
doPop(e);
}
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger())
doPop(e);
}
private void doPop(MouseEvent e) {
PopUpDemo menu = new PopUpDemo();
menu.show(e.getComponent(), e.getX(), e.getY());
}
}
// Then on your component(s)
component.addMouseListener(new PopClickListener());
Bien sûr, les tutoriels ont une explication un peu plus approfondie .
Remarque: Si vous remarquez que le menu contextuel apparaît loin de l'endroit où l'utilisateur a cliqué, essayez d'utiliser les méthodes e.getXOnScreen()
et e.getYOnScreen()
pour les coordonnées x et y.
PopClickListener
extension s'étendMouseAdapter
?component
?Cette question est un peu ancienne - tout comme les réponses (et le tutoriel aussi)
L'API actuelle pour définir un menu contextuel dans Swing est
De cette façon, il sera affiché automatiquement, à la fois pour les déclencheurs de souris et de clavier (ce dernier dépend de LAF). De plus, il prend en charge la réutilisation du même popup sur les enfants d'un conteneur. Pour activer cette fonctionnalité:
la source
JTable
pour qu'il apparaisse sur la ligne sélectionnée ou sur la ligne où vous faites un clic droit? Ou dans ce scénario, l'ancienne méthode est-elle celle à choisir?Il existe une section sur la création d'un menu contextuel dans l'article Comment utiliser les menus des didacticiels Java qui explique comment utiliser la
JPopupMenu
classe.L'exemple de code dans le didacticiel montre comment ajouter des
MouseListener
s aux composants qui doivent afficher un menu contextuel et affiche le menu en conséquence.(La méthode que vous décrivez est assez similaire à la façon dont le didacticiel présente la façon d'afficher un menu contextuel sur un composant.)
la source
Le code suivant implémente un menu contextuel par défaut connu à partir des fonctions
Windows
de copier, couper, coller, sélectionner tout, annuler et rétablir. Cela fonctionne également surLinux
etMac OS X
:Usage:
Maintenant, le
textArea
aura un menu contextuel quand il sera cliqué avec le bouton droit de la souris.la source
releasedEvent.isPopupTrigger()
au lieu dereleasedEvent.getButton() == MouseEvent.BUTTON3
pour fonctionner correctement sur toutes les plateformes.pressedEvent.getModifiersEx() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
ceux - ci doivent être les deuxEx
ou nonEx
. LaEx
version degetMenuShortcutKeyMask()
n'est disponible que depuis java 10+.Je corrigerai l'utilisation de cette méthode suggérée par @BullyWillPlaza. La raison en est que lorsque j'essaie d'ajouter ajouter textArea uniquement à contextMenu, ce n'est pas visible, et si je l'ajoute à la fois à contextMenu et à certains panneaux, il compte: une double association parent différente si j'essaie de passer à l'éditeur de conception.
Créez un écouteur de souris comme celui-ci pour l'objet texte sur lequel vous devez avoir une fenêtre contextuelle. Ce que cela fera, c'est que lorsque vous cliquez avec le bouton droit sur votre objet texte, il ajoutera cette fenêtre contextuelle et l'affichera. De cette façon, vous ne rencontrez pas cette erreur. La solution créée par @BullyWillPlaza est très bonne, riche et rapide à implémenter dans votre programme, vous devriez donc l'essayer pour voir comment vous l'aimez.
la source