“当用户在列表上点击下一个元素时,是否有办法阻止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);
- }
- });
- }
- }