“当用户在列表上点击下一个元素时,是否有办法阻止JList选择最后一个元素?”
这是有人问here 的问题,我也有同样的问题.那个家伙发现了一个如此的解决方案(通过重写processMouseEvent()),但是我想知道是否有更好/更优雅的方式来做到这一点.
[编辑]
好的,更多的细节.
如果您有一个JList,并且有一些空格未被任何单元格/元素占用,并且您单击该空间,那么JList中的最后一个元素被选中.
对于一个真实的例子,尝试这个JList Swing Tutorial example,点击空格,看看Rollo被选中.
解决方法
见
https://forums.oracle.com/forums/thread.jspa?threadID=2206996
import java.awt.EventQueue; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.InputEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JScrollPane; public class TestJList { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { JList list = new JList(new Object[] { "One","Two","Three" }) { @Override public int locationToIndex(Point location) { int index = super.locationToIndex(location); if (index != -1 && !getCellBounds(index,index).contains(location)) { return -1; } else { return index; } } }; list.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { JList list = (JList) e.getSource(); if (list.locationToIndex(e.getPoint()) == -1 && !e.isShiftDown() && !isMenuShortcutKeyDown(e)) { list.clearSelection(); } } private boolean isMenuShortcutKeyDown(InputEvent event) { return (event.getModifiers() & Toolkit.getDefaultToolkit() .getMenuShortcutKeyMask()) != 0; } }); JFrame frame = new JFrame("Test"); frame.setDefaultCloSEOperation(JFrame.DISPOSE_ON_CLOSE); frame.getContentPane().add(new JScrollPane(list)); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } }