Ich erstelle gerade ein Rechtsklick-Kontextmenü durch Instanziieren eines neuen JMenu
mit der rechten Maustaste und Einstellung seiner Position auf die Position der Maus ... Gibt es einen besseren Weg?Wie erstelle ich ein Kontextmenü in Java Swing?
Antwort
Sie sind wahrscheinlich manuell setVisible(true)
auf dem Menü aufrufen. Das kann ein böses Buggy-Verhalten im Menü verursachen.
Die show(Component, int x, int x)
Methode behandelt alle Dinge, die Sie tun müssen, (Markieren von Dingen auf mouseover und Schließen des Popup bei Bedarf) wo setVisible(true)
zeigt nur das Menü ohne zusätzliches Verhalten hinzuzufügen.
Um ein Rechtsklick-Popup-Menü zu erstellen, erstellen Sie einfach eine JPopupMenu
.
class PopUpDemo extends JPopupMenu {
JMenuItem anItem;
public PopUpDemo(){
anItem = new JMenuItem("Click Me!");
add(anItem);
}
}
Dann alles, was Sie tun müssen, ist eine benutzerdefinierte Add MouseListener
zu den Komponenten würden Sie das Menü für Popup mögen.
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 slightly more in-depth Erklärung.
Hinweis: Wenn Sie, dass das Popup-Menü bemerken, erscheint weg von wo der Benutzer geklickt hat, versuchen Sie die e.getXOnScreen()
und e.getYOnScreen()
Methoden für die x- und y-Koordinaten.
Es gibt einen Abschnitt über Bringing Up a Popup Menu im How to Use Menus Artikel von The Java Tutorials, der erklärt, wie man die JPopupMenu
Klasse benutzt.
Der Beispielcode in der Anleitung zeigt, wie Sie MouseListener
s zu den Komponenten hinzufügen, die ein Popup-Menü anzeigen sollen, und das Menü entsprechend anzeigen.
(Die Methode, die Sie beschreiben, ist ziemlich ähnlich wie das Tutorial die Art und Weise präsentiert ein Pop-up-Menü auf einer Komponente zu zeigen.)
Diese Frage ist ein bisschen alt - wie die Antworten (und das Tutorial auch) sind, werden
Der aktuelle api eine popupMenu in Swing für die Einstellung ist
myComponent.setComponentPopupMenu(myPopupMenu);
diese Weise ist es automatisch angezeigt sowohl für Maus- als auch für Tastaturauslöser (Letzteres hängt von LAF ab). Außerdem unterstützt es die Wiederverwendung des gleichen Popups für die untergeordneten Elemente eines Containers. Um diese Funktion zu aktivieren:
myChild.setInheritsPopupMenu(true);
Der folgende Code implementiert einen Menüstandardkontext bekannt aus Windows
mit Kopieren, Ausschneiden, Einfügen, wählen Sie alle, Undo und Redo-Funktionen. Es funktioniert auch auf Linux
und Mac OS X
:
import javax.swing.*;
import javax.swing.text.JTextComponent;
import javax.swing.undo.UndoManager;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class DefaultContextMenu extends JPopupMenu
{
private Clipboard clipboard;
private UndoManager undoManager;
private JMenuItem undo;
private JMenuItem redo;
private JMenuItem cut;
private JMenuItem copy;
private JMenuItem paste;
private JMenuItem delete;
private JMenuItem selectAll;
private JTextComponent textComponent;
public DefaultContextMenu()
{
undoManager = new UndoManager();
clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
addPopupMenuItems();
}
private void addPopupMenuItems()
{
undo = new JMenuItem("Undo");
undo.setEnabled(false);
undo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
undo.addActionListener(event -> undoManager.undo());
add(undo);
redo = new JMenuItem("Redo");
redo.setEnabled(false);
redo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
redo.addActionListener(event -> undoManager.redo());
add(redo);
add(new JSeparator());
cut = new JMenuItem("Cut");
cut.setEnabled(false);
cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
cut.addActionListener(event -> textComponent.cut());
add(cut);
copy = new JMenuItem("Copy");
copy.setEnabled(false);
copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
copy.addActionListener(event -> textComponent.copy());
add(copy);
paste = new JMenuItem("Paste");
paste.setEnabled(false);
paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
paste.addActionListener(event -> textComponent.paste());
add(paste);
delete = new JMenuItem("Delete");
delete.setEnabled(false);
delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
delete.addActionListener(event -> textComponent.replaceSelection(""));
add(delete);
add(new JSeparator());
selectAll = new JMenuItem("Select All");
selectAll.setEnabled(false);
selectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()));
selectAll.addActionListener(event -> textComponent.selectAll());
add(selectAll);
}
private void addTo(JTextComponent textComponent)
{
textComponent.addKeyListener(new KeyAdapter()
{
@Override
public void keyPressed(KeyEvent pressedEvent)
{
if ((pressedEvent.getKeyCode() == KeyEvent.VK_Z)
&& ((pressedEvent.getModifiersEx() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()) != 0))
{
if (undoManager.canUndo())
{
undoManager.undo();
}
}
if ((pressedEvent.getKeyCode() == KeyEvent.VK_Y)
&& ((pressedEvent.getModifiersEx() & Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()) != 0))
{
if (undoManager.canRedo())
{
undoManager.redo();
}
}
}
});
textComponent.addMouseListener(new MouseAdapter()
{
@Override
public void mousePressed(MouseEvent releasedEvent)
{
handleContextMenu(releasedEvent);
}
@Override
public void mouseReleased(MouseEvent releasedEvent)
{
handleContextMenu(releasedEvent);
}
});
textComponent.getDocument().addUndoableEditListener(event -> undoManager.addEdit(event.getEdit()));
}
private void handleContextMenu(MouseEvent releasedEvent)
{
if (releasedEvent.getButton() == MouseEvent.BUTTON3)
{
processClick(releasedEvent);
}
}
private void processClick(MouseEvent event)
{
textComponent = (JTextComponent) event.getSource();
textComponent.requestFocus();
boolean enableUndo = undoManager.canUndo();
boolean enableRedo = undoManager.canRedo();
boolean enableCut = false;
boolean enableCopy = false;
boolean enablePaste = false;
boolean enableDelete = false;
boolean enableSelectAll = false;
String selectedText = textComponent.getSelectedText();
String text = textComponent.getText();
if (text != null)
{
if (text.length() > 0)
{
enableSelectAll = true;
}
}
if (selectedText != null)
{
if (selectedText.length() > 0)
{
enableCut = true;
enableCopy = true;
enableDelete = true;
}
}
if (clipboard.isDataFlavorAvailable(DataFlavor.stringFlavor) && textComponent.isEnabled())
{
enablePaste = true;
}
undo.setEnabled(enableUndo);
redo.setEnabled(enableRedo);
cut.setEnabled(enableCut);
copy.setEnabled(enableCopy);
paste.setEnabled(enablePaste);
delete.setEnabled(enableDelete);
selectAll.setEnabled(enableSelectAll);
// Shows the popup menu
show(textComponent, event.getX(), event.getY());
}
public static void addDefaultContextMenu(JTextComponent component)
{
DefaultContextMenu defaultContextMenu = new DefaultContextMenu();
defaultContextMenu.addTo(component);
}
}
Verbrauch:
JTextArea textArea = new JTextArea();
DefaultContextMenu.addDefaultContextMenu(textArea);
Nun ist die textArea
wird ein Kontextmenü, wenn es richtig angeklickt ist.
Ich werde die Verwendung für die von @BullyWillPlaza vorgeschlagene Methode korrigieren.Grund ist, dass, wenn ich versuche, textArea nur contextMenu hinzuzufügen, es nicht sichtbar ist, und wenn ich es sowohl contextMenu als auch einigen Panels hinzufüge, kommt es zu einer anderen doppelten Elternassoziation, wenn ich versuche, zum Designeditor zu wechseln.
TexetObjcet.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)){
contextmenu.add(TexetObjcet);
contextmenu.show(TexetObjcet, 0, 0);
}
}
});
Machen Sie Maus Listener wie folgt für Text-Objekt, das Sie Popup auf haben müssen. 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. Lösung, die @BullyWillPlaza gemacht ist sehr gut, reich und schnell in Ihrem Programm zu implementieren, so dass Sie es versuchen sollten, sehen Sie, wie es Ihnen gefällt.
Vergessen Sie auch nicht, dass Sie dieses contextMenu importieren und eine neue Instanz erstellen müssen. –
- 1. Wie erstelle ich die folgende GUI in Java Swing?
- 2. Wie erstelle ich ein Kontextmenü auf einem MenuItem einer Navigationsleiste?
- 3. Java Swing Combobox mit automatischer Vervollständigung und Kontextmenü
- 4. Java - Wie erstelle ich ein benutzerdefiniertes Dialogfeld?
- 5. Wie würde ich ein reaktionsfähiges Layout in Java Swing erstellen
- 6. Wie erstelle ich 3D Tag Cloud in Java
- 7. Wie erstelle ich ein Überglas in Ceylon
- 8. Java Swing - Wie man ein JPanel deaktiviert?
- 9. Wie erstelle ich ein ziehbares Objekt in Java?
- 10. Wie erstelle ich ein eigenes Java-Objekt in FTL
- 11. Wie erstelle ich ein Overlay-Fenster in Java?
- 12. Wie erstelle ich ein Tortendiagramm in Java ME?
- 13. Wie erstelle ich eine Karte in Java?
- 14. Ein klassisches StackOverflow: Java Swing
- 15. Wie erstelle ich Kafka ZKStringSerializer in Java?
- 16. Wie erstelle ich eine Drop-Down-Liste in Java Swing mit mehreren Artikelauswahl?
- 17. in Java Swing
- 18. Wie kann ich in Java Swing einen Schlagschatten, ein inneres Leuchten und ein äußeres Leuchten erzeugen?
- 19. Wie erstelle ich einen Ordner in Java?
- 20. PropertyGrid in Java Swing
- 21. Wie erstelle ich ein AttributSet in Android?
- 22. Positionierung in Java Swing
- 23. Wie erstelle ich ein Leinwandauswahlwerkzeug?
- 24. Wie erstelle ich ein Kartensymbol?
- 25. Wie ich Kontextmenü
- 26. Wie erstelle ich ein JSON-Dokument mit Java?
- 27. Wie erstelle ich ein Plugin-fähiges Java-Programm?
- 28. MVC Java Swing qestion
- 29. Wie erstelle ich ein PDF?
- 30. Wie erstelle ich ein jqGrid
Nach dem obigen Code verwenden, erhalte ich die Fehlermeldung, dass „Die Methode addMouseListener (Mouselistener) in der Art Abbildung für die Argumente nicht anwendbar ist (PopClickListener)“ Regards, Vinay –
@ user1035905 Haben Sie sicherstellen, dass die ' PopClickListener erweitert 'MouseAdapter'? – jjnguy
Wie funktioniert es mit der Kontextmenütaste auf der Tastatur? –