Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JList在使用KeyListener时报告不正确的索引_Java_Keylistener - Fatal编程技术网

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

Java JList在使用KeyListener时报告不正确的索引,java,keylistener,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 {

我想了解当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;
                }
            }
        });
    }
}
import java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入javax.swing.JFrame;
导入javax.swing.JList;
导入java.awt.BorderLayout;
公共类列表测试
{
私有JFrame;
私有字符串[]值=新字符串[]{“第0行”、“第1行”、“第2行”、“第3行”};
公共静态void main(字符串[]args)
{
ListTest窗口=新建ListTest();
window.frame.setVisible(true);
}
公共列表测试()
{
frame=新的JFrame();
框架.立根(100100136153);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JList列表=新的JList(值);
frame.getContentPane().add(列表,BorderLayout.CENTER);
列表。设置所选索引(0);
addKeyListener(新的KeyListener()
{
@凌驾
public void keyReleased(KeyEvent arg0){}
@凌驾
public void keyTyped(KeyEvent arg0){}
@凌驾
按下公共无效键(按键事件e)
{
int code=e.getKeyCode();
开关(代码)
{ 
case KeyEvent.VK_UP:
System.out.println(“UP”+list.getSelectedIndex());
打破
case KeyEvent.VK_向下:
System.out.println(“DOWN”+list.getSelectedIndex());
打破
}
}
});
}
}

因为按下
事件将返回上一个选择

只需获取
keyreased
事件的输出,您就可以了

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;
            }
        }
下面是对keyevents的更好解释

按键按下():当按键按下时

keyReleased():当钥匙出现时

keyTyped():发送此键表示的unicode字符时 由键盘向系统输入


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

非常感谢。和往常一样,答案就在我面前;我就是看不见:-)不客气。编辑时有更好的解释。这种情况可能会引起学术界的兴趣,但我觉得有必要指出,倾听JList选择更改的正确方法是使用,因为显然箭头键不是更改选择的唯一方法。