Actualmente estoy creando un menú contextual con el botón derecho al crear un nuevo JMenu
haciendo clic con el botón derecho y estableciendo su ubicación al de la posición del mouse ... ¿Hay una manera mejor?¿Cómo creo un menú contextual de clic derecho en Java Swing?
Respuesta
Usted probablemente está llamando manualmente setVisible(true)
en el menú. Eso puede causar un comportamiento desagradable con errores en el menú.
El método show(Component, int x, int x)
maneja todo lo que necesita suceder (resaltar las cosas al pasar el mouse y cerrar la ventana emergente cuando sea necesario) donde usar setVisible(true)
solo muestra el menú sin agregar ningún comportamiento adicional.
Para hacer un menú emergente con el botón derecho simplemente cree un JPopupMenu
.
class PopUpDemo extends JPopupMenu {
JMenuItem anItem;
public PopUpDemo(){
anItem = new JMenuItem("Click Me!");
add(anItem);
}
}
Entonces, todo lo que tiene que hacer es añadir una costumbre MouseListener
a los componentes que desea el menú emergente para a.
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());
Por supuesto, los tutoriales tienen una explicación slightly more in-depth.
Nota: Si usted nota que el menú emergente aparece muy lejos de donde el usuario ha hecho clic, intenta usar los métodos y e.getXOnScreen()
e.getYOnScreen()
para las coordenadas x e y.
Hay una sección en Bringing Up a Popup Menu en el artículo How to Use Menus de The Java Tutorials que explica cómo utilizar la clase JPopupMenu
.
El código de ejemplo en el tutorial muestra cómo agregar MouseListener
a los componentes que deben mostrar un menú emergente, y muestra el menú correspondiente.
(El método que usted describe es bastante similar a la forma en que el tutorial presenta la manera de mostrar un menú emergente en un componente.)
Esta pregunta es un poco viejo - al igual que las respuestas (y el tutorial así)
la API actual para el establecimiento de un popupMenu de oscilación es
myComponent.setComponentPopupMenu(myPopupMenu);
De esta manera se mostrará automagicamente , tanto para desencadenantes de mouse y teclado (este último depende de LAF). Además, admite la reutilización de la misma ventana emergente en los elementos secundarios de un contenedor. Para habilitar esta característica:
myChild.setInheritsPopupMenu(true);
El código siguiente implementa un menú de contexto por defecto conocido de Windows
con copiar, cortar, pegar, seleccionar todo, deshacer y rehacer funciones. También trabaja en Linux
y 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);
}
}
Uso:
JTextArea textArea = new JTextArea();
DefaultContextMenu.addDefaultContextMenu(textArea);
Ahora el textArea
tendrá un menú contextual cuando se hace clic derecho en.
Corregiré el uso del método que @BullyWillPlaza sugirió.La razón es que cuando trato de agregar texto agregado a solo contextMenu, no está visible, y si lo agrego a ambos a contextMenu y al panel, lo echounters: asociación doble padre diferente si intento cambiar al editor de diseño.
TexetObjcet.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isRightMouseButton(e)){
contextmenu.add(TexetObjcet);
contextmenu.show(TexetObjcet, 0, 0);
}
}
});
Haga que el detector de mouse así para el objeto de texto que necesita tener emergente. Lo que hará es hacer clic derecho en su objeto de texto, luego agregará esa ventana emergente y lo mostrará. De esta forma no encuentras ese error. La solución que @BullyWillPlaza hizo es muy buena, rica y rápida de implementar en su programa, por lo que debe probarla para ver cómo le gusta.
Además, no olvide que aún necesita importar ese contextMenu y crear una nueva instancia. –
- 1. Haga clic derecho en el menú contextual para Java JTree?
- 2. haga clic derecho en el menú contextual jquery
- 3. Cómo agregar menú contextual al menú contextual de NSOutlineView (
- 4. Mostrar el menú contextual en ctrl-clic/clic derecho en el encabezado de NSTableView
- 5. Cómo mostrar un menú contextual al hacer clic con el botón derecho en un elemento de menú
- 6. Menú contextual de Extjs (clic con el botón derecho) en un botón
- 7. Menú contextual por clic corto
- 8. Cómo agregar un elemento de menú al menú contextual predeterminado del botón derecho
- 9. Menú contextual del botón derecho en la bandeja del sistema
- 10. Menú de clic derecho debajo de winforms
- 11. menú contextual con el botón derecho del mouse para datagridview
- 12. Delphi agregar elemento de menú en Windows Explorer clic derecho
- 13. Cómo crear un menú contextual con el botón derecho para un botón en WPF
- 14. PyQt y menú contextual
- 15. ¿cómo puedo agregar un menú de clic derecho al buscador
- 16. Intellij haga clic derecho en los problemas del menú contextual en Ubuntu
- 17. Haz clic derecho en contextMenu en QPushButton
- 18. menú desplegable Java swing y jlist
- 19. ¿Cómo agregar un elemento de menú contextual (usando "clic derecho") a un archivo en el buscador Mac OS X?
- 20. ¿Cómo modificar el menú contextual en CKEditor?
- 21. Haz clic derecho en GWT?
- 22. Extensión de Chrome: menú dinámico con clic derecho
- 23. ¿Cómo coloco correctamente un menú contextual cuando hago clic con el botón derecho en el encabezado de columna de DataGridView?
- 24. Cocoa: Cómo tener un menú contextual al hacer clic con el botón derecho en una celda de NSTableView
- 25. Menú contextual de TabControl
- 26. Agregar un menú contextual a un elemento
- 27. ¿Cómo agregar menú contextual a wpf datagrid?
- 28. jQuery Menú contextual con el botón derecho Ayuda!
- 29. Cómo desencadenar el menú contextual del navegador en un elemento. (Como si el usuario hiciera clic derecho)
- 30. Menú de clic derecho en la aplicación de consola
Después de usar el código anterior, me sale el error diciendo que "El addMouseListener método (MouseListener) en el tipo de la figura no es aplicable a los argumentos (PopClickListener)" Saludos, Vinay –
@ user1035905 ¿Usted asegúrese de que el ' PopClickListener' extiende 'MouseAdapter'? – jjnguy
¿Cómo se consigue que funcione con la tecla de menú contextual en el teclado? –