gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:18:10 26 4
gpt4 key购买 nike

这里是第一个问题,希望我做得正确。

下面是我的问题的一个最小示例,我很快就提出了代表我的项目的示例。我为包含一些对象的 JList 创建了一个自定义渲染器(在示例中我使用了字符串来进行说明)。我的问题是,据我所知,如果我将 ListSelectionListener 添加到列表中,setSelected...() 方法系列不会触发以下事件:触发条件 if(e.getValueIsAdjusting())

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

我想要这个功能,这样我的程序流程将是,在用户从列表中添加/删除项目后,一旦选定的列表项发生更改,“ View ”就会立即更新。

我是否做错了什么,或者我的处理方法不正确?

谢谢。 :)

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, 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);
}
}
}

最佳答案

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

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

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

关于java - ListSelectionListener 调用 setSelected 方法时不会触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62349501/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com