繁体   English   中英

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

[英]JList actionlistener “delay” in selecting item

我有一个最初由ArrayList<SomeClass>填充的JList ,我将其转换为数组。 然后,将此JList包装在JScrollPane并显示在JFrame 当我在其中选择一个项目时,选择的第一个项目是正确的,但是之后似乎选择了上一个项目。 因此,如果我有一个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();
    }
}

选择19、18的输出。17:

运行:19号19号19号19 18号18

但是,选择0、1、2的输出

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

为什么会这样?

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

公共诠释getFirstIndex()

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

公共诠释getLastIndex()

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

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

暂无
暂无

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

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