Si se hace clic en un índice seleccionado en una JList, quiero que se anule la selección. En otras palabras, al hacer clic en los índices en realidad se alterna su selección. No parece que este fue apoyada, por lo que tratéJList - anule la selección al hacer clic en un elemento ya seleccionado
list.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent evt)
{
java.awt.Point point = evt.getPoint();
int index = list.locationToIndex(point);
if (list.isSelectedIndex(index))
list.removeSelectionInterval(index, index);
}
});
El problema aquí es que esto se invoca después de JList ya ha actuado en el caso del ratón, por lo que anula la selección de todo. Entonces intenté eliminar todos los MouseListeners de JList, agregué los míos y luego volví a agregar todos los oyentes predeterminados. Eso no funcionó, ya que JList volvería a seleccionar el índice después de que lo deseleccionara. De todos modos, lo que eventualmente se me ocurrió es
MouseListener[] mls = list.getMouseListeners();
for (MouseListener ml : mls)
list.removeMouseListener(ml);
list.addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent evt)
{
java.awt.Point point = evt.getPoint();
final int index = list.locationToIndex(point);
if (list.isSelectedIndex(index))
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
list.removeSelectionInterval(index, index);
}
});
}
});
for (MouseListener ml : mls)
list.addMouseListener(ml);
... y eso funciona. Pero no me gusta ¿Hay una mejor manera?
Honestamente, lo habría hecho como usted ya lo describe, usando un 'MouseAdapter'. Si hay una solución más elegante, me encantaría saber sobre eso también. –
Esto es compatible por defecto en JList, pero tiene que presionar Ctrl-Click (al menos en Windows) en un elemento seleccionado para anular su selección. – lbalazscs