选择项目时JList actionlistener“延迟”

时间:2016-11-11 20:00:29

标签: java swing jlist listselectionlistener

我有JList填充了最初为ArrayList<SomeClass>的内容,我将其转换为数组。然后,JListJScrollPane包裹在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

为什么会这样?

1 个答案:

答案 0 :(得分:1)

ListSelectionEvent类中有两种感兴趣的方法:

  

public int getFirstIndex()

     

返回其选择可能已更改的第一行的索引。

     

public int getLastIndex()

     

返回其选择可能已更改的最后一行的索引。

因此,选择事件实际上涉及2个列表元素,一个获得焦点,另一个失去焦点