Ich erstelle derzeit ein Kontextmenü mit Rechtsklick, indem ich beim Klicken JMenu
mit der rechten Maustaste einen neuen Kontextmenü instanziiere und dessen Position auf die Position der Maus einstelle ... Gibt es einen besseren Weg?
quelle
Ich erstelle derzeit ein Kontextmenü mit Rechtsklick, indem ich beim Klicken JMenu
mit der rechten Maustaste einen neuen Kontextmenü instanziiere und dessen Position auf die Position der Maus einstelle ... Gibt es einen besseren Weg?
Sie rufen wahrscheinlich manuell setVisible(true)
im Menü auf. Das kann zu bösem Buggy-Verhalten im Menü führen.
Die show(Component, int x, int x)
Methode behandelt alle Dinge, die passieren müssen (Hervorheben von Dingen beim Mouseover und Schließen des Popups bei Bedarf), wobei bei Verwendung setVisible(true)
nur das Menü angezeigt wird, ohne dass zusätzliches Verhalten hinzugefügt wird.
Um ein Popup-Menü mit der rechten Maustaste zu erstellen, erstellen Sie einfach ein JPopupMenu
.
class PopUpDemo extends JPopupMenu {
JMenuItem anItem;
public PopUpDemo() {
anItem = new JMenuItem("Click Me!");
add(anItem);
}
}
Anschließend müssen Sie nur noch eine benutzerdefinierte MouseListener
Komponente zu den Komponenten hinzufügen, für die das Menü angezeigt werden soll.
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());
Natürlich haben die Tutorials eine etwas ausführlichere Erklärung.
Hinweis: Wenn Sie feststellen, dass das Popup-Menü weit entfernt von der Stelle angezeigt wird, auf die der Benutzer geklickt hat, verwenden Sie die Methoden e.getXOnScreen()
und e.getYOnScreen()
für die x- und y-Koordinaten.
PopClickListener
erweitertMouseAdapter
?component
?Diese Frage ist etwas alt - ebenso wie die Antworten (und auch das Tutorial)
Die aktuelle API zum Einstellen eines Popup-Menüs in Swing ist
Auf diese Weise wird es sowohl für Maus- als auch für Tastaturauslöser automatisch angezeigt (letzteres hängt von LAF ab). Außerdem wird die Wiederverwendung desselben Popups für die untergeordneten Elemente eines Containers unterstützt. So aktivieren Sie diese Funktion:
quelle
JTable
damit es in der ausgewählten Zeile oder in der Zeile, in der Sie mit der rechten Maustaste klicken, angezeigt wird? Oder ist in diesem Szenario die alte Methode zu wählen?Es gibt einen Abschnitt zum Aufrufen eines Popup-Menüs im Artikel Verwenden von Menüs in den Java-Tutorials, in dem die Verwendung der
JPopupMenu
Klasse erläutert wird .Der Beispielcode im Lernprogramm zeigt, wie Sie
MouseListener
s zu den Komponenten hinzufügen , die ein Popup-Menü anzeigen sollen, und zeigt das Menü entsprechend an.(Die von Ihnen beschriebene Methode ähnelt der Art und Weise, wie im Lernprogramm ein Popup-Menü für eine Komponente angezeigt wird.)
quelle
Der folgende Code implementiert ein Standardkontextmenü
Windows
mit Funktionen zum Kopieren, Ausschneiden, Einfügen, Auswählen aller, Rückgängig machen und Wiederherstellen. Es funktioniert auch aufLinux
undMac OS X
:Verwendung:
Jetzt
textArea
wird ein Kontextmenü angezeigt, wenn Sie mit der rechten Maustaste darauf klicken.quelle
releasedEvent.isPopupTrigger()
anstattreleasedEvent.getButton() == MouseEvent.BUTTON3
auf allen Plattformen richtig zu arbeiten.pressedEvent.getModifiersEx() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()
Dies müssen beide seinEx
oder nichtEx
. DieEx
Version vongetMenuShortcutKeyMask()
ist erst seit Java 10+ verfügbar.Ich werde die Verwendung für diese von @BullyWillPlaza vorgeschlagene Methode korrigieren. Der Grund dafür ist, dass wenn ich versuche, textArea nur zu contextMenu hinzuzufügen, es nicht sichtbar ist, und wenn ich es sowohl zu contextMenu als auch zu einem Panel hinzufüge, wird Folgendes festgestellt: Unterschiedliche übergeordnete doppelte Zuordnung, wenn ich versuche, zum Design-Editor zu wechseln.
Erstellen Sie einen solchen Maus-Listener für Textobjekte, für die ein Popup erforderlich ist. Wenn Sie mit der rechten Maustaste auf Ihr Textobjekt klicken, wird dieses Popup hinzugefügt und angezeigt. Auf diese Weise tritt dieser Fehler nicht auf. Die von @BullyWillPlaza erstellte Lösung ist sehr gut, umfangreich und schnell in Ihrem Programm zu implementieren. Probieren Sie sie aus, um zu sehen, wie es Ihnen gefällt.
quelle