JList在击键时删除所选项目并单击

时间:2016-06-23 19:03:32

标签: java swing jlist mouselistener

我的任务是在按下alt并单击jlist时启用删除Jlist选定元素。我通过在我的jlist中添加鼠标监听器来实现这一点:

list.addMouseListener(new MouseAdapter(){
        public void mouseClicked(MouseEvent e) {
            java.util.List selectedItems = list.getSelectedValuesList();
            if (e.isAltDown()){
                for (Object o : selectedItems){
                    cm.removeElement(o); //cm is my custom model
                }
            }
        }
    });

我的问题是,当选择了两个元素时,我点击列表并按下alt,只选择最近的元素,然后删除。我不知道如何使用此输入组合删除多个元素。

2 个答案:

答案 0 :(得分:3)

问题是鼠标单击会清除所有先前的选择,然后选择您刚刚单击的行。因此,只删除该行。

因此,您应该处理“鼠标右键”,然后仅使用鼠标右键删除项目。

if (e.isAltDown() && SwingUtilities.isRightMouseButton(e)) {

或者,如果您真的想在鼠标左键单击时执行此操作,则可能需要使用ListSelectionListener。每次选择更改时,您都需要使用getSelectedValuesList()方法并保存方法返回的List。然后在MouseListener中,您将访问已保存的列表,而不是获取当前选定的项目列表。

我不喜欢这种方法,因为逻辑现在包含在两个独立的侦听器中。虽然我猜你可以创建一个实现选择监听器和鼠标监听器的类。

答案 1 :(得分:1)

  

这不是一个完美的答案。但它解决了这个问题

我只是试图了解选择事件的工作原理。当他选择发生时,触发鼠标按下事件,然后选择发生。因此,已添加到组件的MouseListener负责进行选择。删除已经存在的MouseListener将阻止使用鼠标进行选择。所以我这样做了。

        MouseListener[] adapters = list.getMouseListeners();
        for (int i = 0; i < adapters.length; i++) {
            list.removeMouseListener(adapters[i]);
        }

现在用户将无法使用鼠标进行选择,但他将使用键盘进行选择。所以下面的内容可行。

       list.addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(MouseEvent e) {
            java.util.List selectedItems = list.getSelectedValuesList();
            if (e.isAltDown()){
                for (Object o : selectedItems){
                    model.removeElement(o); //cm is my custom model
                }
            }
            }
        });

我认为应该遵循 camickr 给出的答案。