我有JList
填充了最初为ArrayList<SomeClass>
的内容,我将其转换为数组。然后,JList
将JScrollPane
包裹在JFrame
中并显示在ArrayList<String>
上。当我在其中选择一个项目时,所选的第一个项目是正确的,但在此之后它似乎选择了上一个项目。所以,如果我有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();
}
}
填充的“数字0”,“数字1”,“数字2”等,我按顺序选择19,18,17,输出就好像我选择了19 ,19,18:
{{1}}
选择19,18的输出.17:
run:19 Number 19 19 Number 19 18 Number 18
但是,选择0,1,2:
的输出运行:0数字0 1数字1 2数字2
为什么会这样?
答案 0 :(得分:1)
ListSelectionEvent类中有两种感兴趣的方法:
public int getFirstIndex()
返回其选择可能已更改的第一行的索引。
public int getLastIndex()
返回其选择可能已更改的最后一行的索引。
因此,选择事件实际上涉及2个列表元素,一个获得焦点,另一个失去焦点