JList actionlistener "delay" 在选择项目
JList actionlistener "delay" in selecting item
我有一个 JList
填充了最初是 ArrayList<SomeClass>
的内容,我将其转换为数组。这个 JList
然后被包裹在 JScrollPane
中并显示在 JFrame
上。当我select其中的一项时,第一项selected是正确的,但之后似乎select前一项。因此,如果我有一个 ArrayList<String>
填充 "Number 0"、"Number 1"、"Number 2" 等,并且我按此顺序 select 19、18、17,输出是就好像我 selected 19, 19, 18:
import java.awt.Dimension;
import javax.swing.*;
import java.util.*;
import javax.swing.event.*;
public class DemoFrame extends JFrame implements ListSelectionListener{
ArrayList<String> strings;
public DemoFrame(){
strings = new ArrayList();
for (int i=0; i<20; i++){
strings.add("Number " + i);
}
JList demoList = new JList();
demoList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
demoList.setVisibleRowCount(10);
JScrollPane listScroller = new JScrollPane(demoList);
listScroller.setPreferredSize(new Dimension(250, 500));
demoList.setListData(strings.toArray());
this.add(listScroller);
demoList.addListSelectionListener(this);
getContentPane().add(listScroller);
pack();
setVisible(true);
}
@Override
public void valueChanged(ListSelectionEvent lse) {
if (!lse.getValueIsAdjusting()){
System.out.println(lse.getLastIndex());
System.out.println(strings.get(lse.getLastIndex()));
}
}
}
public class SODemo{
public static void main(String[] args) {
DemoFrame demo = new DemoFrame();
}
}
来自 selecting 19, 18. 17 的输出:
run: 19 Number 19 19 Number 19 18 Number 18
但是,selecting 0、1、2 的输出:
run: 0 Number 0 1 Number 1 2 Number 2
为什么会这样?
ListSelectionEvent 中有 2 个感兴趣的方法class:
public int getFirstIndex()
Returns the index of the first row whose selection may have changed.
public int getLastIndex()
Returns the index of the last row whose selection may have changed.
所以一个选择事件实际上涉及2个列表元素,一个获得焦点,一个失去焦点
我有一个 JList
填充了最初是 ArrayList<SomeClass>
的内容,我将其转换为数组。这个 JList
然后被包裹在 JScrollPane
中并显示在 JFrame
上。当我select其中的一项时,第一项selected是正确的,但之后似乎select前一项。因此,如果我有一个 ArrayList<String>
填充 "Number 0"、"Number 1"、"Number 2" 等,并且我按此顺序 select 19、18、17,输出是就好像我 selected 19, 19, 18:
import java.awt.Dimension;
import javax.swing.*;
import java.util.*;
import javax.swing.event.*;
public class DemoFrame extends JFrame implements ListSelectionListener{
ArrayList<String> strings;
public DemoFrame(){
strings = new ArrayList();
for (int i=0; i<20; i++){
strings.add("Number " + i);
}
JList demoList = new JList();
demoList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
demoList.setVisibleRowCount(10);
JScrollPane listScroller = new JScrollPane(demoList);
listScroller.setPreferredSize(new Dimension(250, 500));
demoList.setListData(strings.toArray());
this.add(listScroller);
demoList.addListSelectionListener(this);
getContentPane().add(listScroller);
pack();
setVisible(true);
}
@Override
public void valueChanged(ListSelectionEvent lse) {
if (!lse.getValueIsAdjusting()){
System.out.println(lse.getLastIndex());
System.out.println(strings.get(lse.getLastIndex()));
}
}
}
public class SODemo{
public static void main(String[] args) {
DemoFrame demo = new DemoFrame();
}
}
来自 selecting 19, 18. 17 的输出:
run: 19 Number 19 19 Number 19 18 Number 18
但是,selecting 0、1、2 的输出:
run: 0 Number 0 1 Number 1 2 Number 2
为什么会这样?
ListSelectionEvent 中有 2 个感兴趣的方法class:
public int getFirstIndex()
Returns the index of the first row whose selection may have changed.
public int getLastIndex()
Returns the index of the last row whose selection may have changed.
所以一个选择事件实际上涉及2个列表元素,一个获得焦点,一个失去焦点