加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:11:33 所属栏目:Java 来源:网络整理
导读:“当用户在列表上点击下一个元素时,是否有办法阻止JList选择最后一个元素?” 这是有人问here 的问题,我也有同样的问题.那个家伙发现了一个如此的解决方案(通过重写processMouseEvent()),但是我想知道是否有更好/更优雅的方式来做到这一点. [编辑] 好的,更多
“当用户在列表上点击下一个元素时,是否有办法阻止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);
            }
        });
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读