java - 如何防止 JList 在单元格边界外进行选择?

标签 java swing jlist

“有什么方法可以防止 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);
            }
        });
    }
}

关于java - 如何防止 JList 在单元格边界外进行选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11138665/

相关文章:

java - 另一种为 JMenuItem 设置助记符的方法?

java - int不能转换成字符串?

java - 我如何找到是否在 Swing 上打开了一个窗口

java - 类型 JList 不接受参数类型 <String>

java - 为什么 FileInputStream read() 方法错误地读取问号(ascii : 63) when put into infinite loop?

javadoc:还显示父类方法的描述

java - 无法在 JScrollPane 内构建或显示带有复选框的 Swing JTable

java - Spring 布局中的水平线

java - Jlist 自定义渲染器

java - 为什么我不能将 ArrayList 直接添加到 Jlist 中?