研究该问题的先导:
ListSelectionListioner,就是在列表被鼠标选中时触发事件。鼠标按下会响应一次,鼠标释放又会响应一次,因此一次鼠标的点击会有两次事件响应(按下和释放)。当用键盘上下键时,只响应一次。
要实现这样的功能:
任何情况下只响应一次。
wordList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
System.out.println(e.getValueIsAdjusting());
if(!e.getValueIsAdjusting() && pressed == true){
pressed = false;
return;
}
do_wordList_valueChanged(e);
}
});
//这里设置鼠标监听,目的是只在鼠标点击时操作
wordList.addMouseListener(new MouseAdapter() {
public void mousePressed (MouseEvent e) {
pressed = true;
}
});
代码分析:
1、ListSelectionListener()和MouseAdapter()的执行先后顺序,是ListSelectionListener()先执行,MouseAdapter()后执行
2、如果只用e.getValueIsAdjusting()判断的话(鼠标是按下状态e.getValueIsAdjusting()为true;鼠标是松开状态e.getValueIsAdjusting()为false)会使键盘的操作失灵。
3、如果只用鼠标的按下或松开做标记的话,当鼠标按下滑动时或鼠标按下操作键盘时会失灵。
4、只要考虑到只有当鼠标之前已经按下,鼠标松开状态的ListSelectionListener()响应才是需要剔除的。再返回前,需要将是否按下标签还原。