ListSelectionListener不会在调用setSelected方法时触发事件

这里的第一个问题,希望我能正确完成。

下面是我遇到的问题的一个最小示例,我迅速提出了我的项目代表。我为包含一些对象的JList创建了一个自定义渲染器(在示例中,出于说明目的,我使用了字符串)。我的问题是,据我所知,如果我向列表中添加ListSelectionListener,则setSelected...()方法族不会触发触发条件if(e.getvalueIsAdjusting())的事件。>

在下面的示例中,启动程序后问题立即显而易见:即使在将JLabel的选定文本分配为“ none”之后调用list.setSelectedIndex(2);,它也不会改变,直到您(用户)单击列出项目。实际上,它必须与当前选择的项目不同。

我想要此功能,以便程序的流程如下:在用户从列表中添加/删除列表项之后,一旦更改了所选列表项,“视图”就会立即更新。

我做错了什么,还是我处理不正确?

谢谢。 :)

import java.awt.BorderLayout;
import java.beans.*;
import javax.swing.*;

public class Example implements propertychangelistener {
    String ITEM_SELECTED = "Item Selected";
    String DELETE_SELECTED = "Delete Selected";
    propertychangesupport pcs = new propertychangesupport(this);
    JLabel selected;

    JList<String> list;
    DefaultListModel<String> model;

    public static void main(String[] args) {
        new Example();
    }

    public Example() {
        JFrame frame = new JFrame();
        JPanel mainPanel = new JPanel(new BorderLayout());

        model = new DefaultListModel<>();
        model.addElement("Entry 1");
        model.addElement("Entry 2");
        model.addElement("Entry 3");
        model.addElement("Entry 4");
        model.addElement("Entry 5");

        list = new JList<>(model);

        selected = new JLabel("Currently selected: none");
        list.setSelectedIndex(2);

        list.addListSelectionListener(e -> {
                if(e.getvalueIsAdjusting()) {
                    pcs.firePropertyChange(ITEM_SELECTED,null,null);
                }
            }
        );

        JButton removeItem = new JButton("Remove item");

        removeItem.addactionListener(e -> {
                pcs.firePropertyChange(DELETE_SELECTED,null);
            }
        );

        mainPanel.add(new JScrollPane(list),BorderLayout.WEST);
        mainPanel.add(removeItem,BorderLayout.NORTH);

        mainPanel.add(selected,BorderLayout.CENTER);       

        pcs.addpropertychangelistener(this);

        frame.add(mainPanel);
        frame.setSize(300,400);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        String event = (String) evt.getPropertyName();

        if (event.equals(ITEM_SELECTED)) {
            selected.setText("Currently selected: " + list.getSelectedValue());
        }

        if (event.equals(DELETE_SELECTED)) {
            int selectedIndex = list.getSelectedIndex();
            model.removeElement(list.getSelectedValue());

            if (selectedIndex > 0)
                list.setSelectedIndex(selectedIndex-1);
            else if (selectedIndex == 0)
                list.setSelectedIndex(selectedIndex);
        }
    }
}
iCMS 回答:ListSelectionListener不会在调用setSelected方法时触发事件

e.getValueIsAdjusting()方法检查该值是否仍在调整中。在您的情况下,list.setSelectedIndex(2)触发的事件似乎会让e.getValueIsAdjusting()返回false。

您可以通过执行相反的检查来解决此问题:!e.getValueIsAdjusting()

然后,它将检查响应的任何更改是否是该事件链的最后更改。

本文链接:https://www.f2er.com/2144974.html

大家都在问