简体   繁体   English

JList动作侦听器“延迟”在选择项目中

[英]JList actionlistener “delay” in selecting item

I have a JList populated by what is initially an ArrayList<SomeClass> which I convert to an array. 我有一个最初由ArrayList<SomeClass>填充的JList ,我将其转换为数组。 This JList is then wrapped in a JScrollPane and displayed on a JFrame . 然后,将此JList包装在JScrollPane并显示在JFrame When I select an item in it, the first item selected is correct, but after that it seems to select the previous item. 当我在其中选择一个项目时,选择的第一个项目是正确的,但是之后似乎选择了上一个项目。 So if I have an ArrayList<String> populated "Number 0", "Number 1", "Number 2", etc. and I select 19, 18, 17 in that order, the output is as if I'd selected 19, 19, 18: 因此,如果我有一个ArrayList<String>填充了“数字0”,“数字1”,“数字2”等,并且我依次选择了19、18、17,则输出就像我选择了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();
    }
}

Output from selecting 19, 18. 17: 选择19、18的输出。17:

run: 19 Number 19 19 Number 19 18 Number 18 运行:19号19号19号19 18号18

However, Output from selecting 0, 1, 2: 但是,选择0、1、2的输出

run: 0 Number 0 1 Number 1 2 Number 2 运行:0数字0 1数字1 2数字2

Why is it behaving like this? 为什么会这样?

There are 2 methods of interest in the ListSelectionEvent class: ListSelectionEvent类中有两种感兴趣的方法:

public int getFirstIndex() 公共诠释getFirstIndex()

Returns the index of the first row whose selection may have changed. 返回其选择可能已更改的第一行的索引。

public int getLastIndex() 公共诠释getLastIndex()

Returns the index of the last row whose selection may have changed. 返回其选择可能已更改的最后一行的索引。

So a selection event actually involves 2 list elements, the one gaining focus and the one losing focus 因此,选择事件实际上涉及2个列表元素,一个是获得焦点,一个是失去焦点

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM