我的两个JList组件有问题。
我创建了两个JList组件并将其放置在JFrame上。我将listSelectionListeners添加到这两个JList中,这样就可以取消选择另一个示例:(edit:按要求制作自包含样本)
public class JListIssue {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel mainPanel = new JPanel();
frame.setContentPane(mainPanel);
final JList jList1 = new JList();
mainPanel.add(jList1);
final JList jList2 = new JList();
mainPanel.add(jList2);
// Setting up models for both JList components to display example values
jList1.setModel(new AbstractListModel() {
String[] items = {"Item 1", "Item 2", "Item 3"};
public int getSize() { return items.length; }
public Object getElementAt(int i) { return items[i]; }
});
jList2.setModel(new AbstractListModel() {
String[] items = {"Item 1", "Item 2", "Item 3"};
public int getSize() { return items.length; }
public Object getElementAt(int i) { return items[i]; }
});
// Adding listeners
jList1.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
jList2.clearSelection();
}
});
jList2.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
jList1.clearSelection();
}
});
frame.pack();
frame.setVisible(true);
}
}但是,当它取消选择这两个列表中的一个列表时,我必须单击两次才能进行新的选择。因为我第一次点击它时,我想要选择的项目的边框并不是真的选中它(由listSelectionListener确认),所以我必须在第一次选择时按住鼠标左键移动鼠标,或者第二次单击,然后它实际上选择了该项目。
我发现这种行为很奇怪,我不希望它像这样。有什么建议吗?
发布于 2010-07-23 22:34:10
您的问题是,响应来自另一个列表的clearSelection()调用,您的ListSelectionListener会收到通知。当您在jlist1上进行选择时,它将在jlist2上调用clearSelection;如果jlist2选择了任何内容,这将在jlist2的选择侦听器上触发valueChanged,清除您刚刚在jlist1上完成的选择。您可能需要添加一个标志,让两个侦听器知道另一个侦听器当前是否正在更改:
//member variable
boolean isChanging = false;
//later.... make this same change in both ListSelectionListeners!
jList2.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if (!isChanging) {
isChanging = true;
jList1.clearSelection();
isChanging = false;
}
}});
发布于 2011-11-08 08:59:08
您可以访问事件变量getValueIsAdjusting(),该变量可以指示此当前事件是否为一系列多事件事件
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting())
jList1.clearSelection();
}https://stackoverflow.com/questions/3318824
复制相似问题