item java swing menu popup jlist

item - Menú emergente Java swing y jlist



jlist java eclipse (2)

No hagas setComponentPopupMenu . En MouseAdapter haz lo siguiente:

public void mousePressed(MouseEvent e) {check(e);} public void mouseReleased(MouseEvent e) {check(e);} public void check(MouseEvent e) { if (e.isPopupTrigger()) { //if the event shows the menu jList.setSelectedIndex(jList.locationToIndex(e.getPoint())); //select the item jPopupMenu.show(jList, e.getX(), e.getY()); //and show the menu } }

Esto debería funcionar.

EDITAR: El código ahora comprueba los eventos de press y release , porque algunas plataformas muestran ventanas emergentes cuando el mouse presiona y algunas otras en el lanzamiento. Consulte el tutorial de Swing para obtener más información.

aquí está mi problema: tengo una jList y un menú emergente. Cuando hago clic derecho en jList, aparece el menú emergente. El problema es que el elemento jList al que apunta el mouse no seleccionará. Y quiero que haga eso. Cuando señalo el cursor en un elemento de la lista y presiono el botón derecho, quiero que ocurran dos cosas. Seleccione el elemento en el que hice clic y muestre el menú emergente.

Intenté esto:

jLists.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { jList.setSelectedIndex(jList.locationToIndex(e.getPoint())); } }); jList.setComponentPopupMenu(jPopupMenu);

Pero solo muestra el menú emergente. Si elimino esta línea:

jList.setComponentPopupMenu(jPopupMenu);

a continuación, haga clic con el botón derecho en Seleccionar funciona (pero el menú emergente no se muestra).

Entonces, ¿cuál crees que es la mejor manera de hacer que estas dos funciones (ambas) funcionen?

Gracias y perdón por mi inglés.


Si desea continuar utilizando setComponentPopupMenu (lo cual es bueno porque maneja las invocaciones de mouse y teclado de la ventana emergente de forma cruzada), puede anular JPopupMenu.show(Component, int, int) para seleccionar la fila adecuada.

JPopupMenu jPopupMenu = new JPopupMenu() { @Override public void show(Component invoker, int x, int y) { int row = jList.locationToIndex(new Point(x, y)); if (row != -1) { jList.setSelectedIndex(row); } super.show(invoker, x, y); } }; jList.setComponentPopupMenu(jPopupMenu);

Tenga en cuenta que cuando se invoca su ventana emergente mediante el teclado (y no se anula también getPopupLocation en su componente de destino), la ubicación x, y que obtenga en JPopupMenu.show será el punto medio de su componente. Si ya hay una selección en este caso, probablemente no desee cambiar la selección.

La solución que surgió para resolver el problema de invocación de teclado frente a mouse fue establecer una propiedad de cliente en el componente reemplazando a getPopupLocation y luego verificarlo al mostrar la ventana emergente. El argumento de getPopupLocation será null cuando se invoca a través del teclado. Aquí está el código central (tal vez implementado en una clase de utilidad disponible para su componente y su menú emergente).

private static final String POPUP_TRIGGERED_BY_MOUSE_EVENT = "popupTriggeredByMouseEvent"; // NOI18N public static Point getPopupLocation(JComponent invoker, MouseEvent event) { boolean popupTriggeredByMouseEvent = event != null; invoker.putClientProperty(POPUP_TRIGGERED_BY_MOUSE_EVENT, Boolean.valueOf(popupTriggeredByMouseEvent)); if (popupTriggeredByMouseEvent) { return event.getPoint(); } return invoker.getMousePosition(); } public static boolean isPopupTriggeredByMouseEvent(JComponent invoker) { return Boolean.TRUE.equals(invoker.getClientProperty(POPUP_TRIGGERED_BY_MOUSE_EVENT)); }

A continuación, anule getPopupLocation en su componente:

@Override public Point getPopupLocation(MouseEvent event) { return PopupMenuUtils.getPopupLocation(this, event); }

y llama a isPopupTriggeredByMouseEvent en una modificación de JPopupMenu.show para determinar si se selecciona o no la fila en la ubicación emergente (o cualquier acción que tenga sentido para el componente subyacente):

JPopupMenu jPopupMenu = new JPopupMenu() { @Override public void show(Component invoker, int x, int y) { int row = jList.locationToIndex(new Point(x, y)); if (row != -1 && PopupMenuUtils.isPopupTriggeredByMouseEvent((JComponent) invoker)) { jList.setSelectedIndex(row); } super.show(invoker, x, y); } };