使用KeyListener时,Java JList报告的索引不正确

时间:2016-11-16 23:33:02

标签: java keylistener

我想了解为什么当KeyPressedListener触发上下按键事件时,此JLIST对象的打印列表索引与突出显示的行不同步,以及我如何解决问题

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JList;
import java.awt.BorderLayout;

public class ListTest
{

    private JFrame frame;
    private String[] values = new String[] {"Line 0", "Line 1", "Line 2", "Line 3"};

    public static void main(String[] args)
    {
        ListTest window = new ListTest();
        window.frame.setVisible(true);
    }
    public ListTest()
    {

        frame = new JFrame();
        frame.setBounds(100, 100, 136, 153);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JList<String> list = new JList<String>(values);
        frame.getContentPane().add(list, BorderLayout.CENTER);
        list.setSelectedIndex(0);
        list.addKeyListener(new KeyListener()
        {
            @Override
            public void keyReleased(KeyEvent arg0){}
            @Override
            public void keyTyped(KeyEvent arg0){}
            @Override
            public void keyPressed(KeyEvent e)
            {
                int code = e.getKeyCode();

                switch( code ) 
                { 
                case KeyEvent.VK_UP:
                    System.out.println("UP " + list.getSelectedIndex());
                    break;
                case KeyEvent.VK_DOWN:
                    System.out.println("DOWN " + list.getSelectedIndex());
                    break;
                }
            }
        });
    }
}

1 个答案:

答案 0 :(得分:3)

因为keyPressed事件将返回上一个选择。

只需获取keyReleased事件的输出即可。

public void keyReleased(KeyEvent arg0){
            int code = arg0.getKeyCode();

            switch( code ) 
            { 
            case KeyEvent.VK_UP:
                System.out.println("UP " + list.getSelectedIndex());
                break;
            case KeyEvent.VK_DOWN:
                System.out.println("DOWN " + list.getSelectedIndex());
                break;
            }
        }

以下是对关键事件的更好解释

  

keyPressed():当密钥关闭时

     

keyReleased():当键出现时

     

keyTyped():当发送此键表示的unicode字符时   通过键盘输入系统。

当键出现时,会发生JList中项目的选择。当keyReleased():被触发时,JList中的下一个项目将被选中。但是keyPressed():事件会在选择项目之前触发。