java - 选择项目中的 JList actionlistener "delay"

标签 java swing jlist listselectionlistener

我有一个JList最初由 ArrayList<SomeClass> 填充我将其转换为数组。这个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 的输出:

run: 19 Number 19 19 Number 19 18 Number 18

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

run: 0 Number 0 1 Number 1 2 Number 2

为什么会这样?

最佳答案

ListSelectionEvent 类中有 2 个值得关注的方法:

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 个列表元素,一个获得焦点,一个失去焦点

关于java - 选择项目中的 JList actionlistener "delay",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40555343/

相关文章:

java - 通过 AsyncTask 传递参数 - android

Java 2d 图形动画框架

Java Swing : JList with ListCellRenderer selected item different height

Java - JList 点击

java - iText 嵌套表 - 第一行未呈现

java - 用户 'root' @'localhost' Spring Boot MySql 访问被拒绝

java - 将绘画保持在 JPanel 边框内

java - 调度鼠标事件

java - 在 Netbeans 中创建的 JList 不允许我添加元素

java - 如何在Java中将字节数组转换为字符串,并跳过所有空字节?