Java JList在击键时删除所选项目,然后单击

Java JList在击键时删除所选项目,然后单击,java,swing,jlist,mouselistener,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(

我的任务是在按下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键的情况下单击列表时,只有最近的元素被选中,然后被删除。我不知道如何用这个输入组合删除几个元素

问题在于,鼠标单击会清除之前的所有选择,然后选择刚才单击的行。因此,仅删除该行

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

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


我不喜欢这种方法,因为逻辑现在包含在两个单独的侦听器中。尽管我想您可以创建一个实现选择侦听器和鼠标侦听器的类。

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

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

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

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

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

我只是想看看选择活动是如何运作的。当选择发生时,会触发鼠标按下事件,然后选择发生。因此,已经添加到组件中的鼠标侦听器负责进行选择。移除已经就位的鼠标侦听器将阻止使用鼠标进行选择。所以我做了这个

        MouseListener[] adapters = list.getMouseListeners();
        for (int i = 0; i < adapters.length; i++) {
            list.removeMouseListener(adapters[i]);
        }
我认为应该遵循camickr给出的答案

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

我只是想看看选择活动是如何运作的。当选择发生时,会触发鼠标按下事件,然后选择发生。因此,已经添加到组件中的鼠标侦听器负责进行选择。移除已经就位的鼠标侦听器将阻止使用鼠标进行选择。所以我做了这个

        MouseListener[] adapters = list.getMouseListeners();
        for (int i = 0; i < adapters.length; i++) {
            list.removeMouseListener(adapters[i]);
        }
我认为应该遵循camickr给出的答案。

这可能会对您有所帮助:当单击按钮进行删除时,此解决方案(以及我的代码)有效。如果必须在鼠标单击+按钮按下时删除,则会失败。这可能会对您有所帮助:当在按钮单击时删除时,此解决方案(以及我的代码)有效。当必须在鼠标单击+按钮按下时,它会失败