【问题标题】:Java JList reporting incorrect index when using a KeyListener使用 KeyListener 时 Java JList 报告不正确的索引
【发布时间】:2017-03-31 08:45:45
【问题描述】:

我想了解为什么当 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;
                }
            }
        });
    }
}

【问题讨论】:

  • 这种情况可能会引起学术兴趣,但我觉得有必要指出,监听 JList 选择变化的正确方法是使用 addListSelectionListener,因为显然箭头键不是更改选择的唯一方法。

标签: java keylistener


【解决方案1】:

因为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():当这个key代表的unicode字符被发送时 通过键盘来系统输入。

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

【讨论】:

  • 非常感谢。像往常一样,答案正盯着我看。我只是看不到它:-)
  • 不客气。编辑了更好的解释。
猜你喜欢
  • 1970-01-01
  • 2018-09-25
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
相关资源
最近更新 更多