2016-11-16 28 views
1

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

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

这种情况可能会引起学术界的兴趣,但我觉得有必要指出,监听JList选择的更改的正确方法是使用[addListSelectionListener](https://docs.oracle.com/javase/8 /docs/api/javax/swing/JList.html#addListSelectionListener-javax.swing.event.ListSelectionListener-),因为显然箭头键并不是改变选择的唯一方法。 – VGR

回答

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; 
      } 
     } 

这里的KeyEvents的一个更好的解释

的keyPressed():当钥匙下降

的keyReleased():当钥匙出现

的keyTyped():当由该键代表的Unicode字符通过键盘被发送到系统输入 。

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

+0

谢谢这么多。像往常一样,答案正在凝视着我;我只是看不到它:-) –

+1

你非常欢迎。编辑更好的解释。 – m4heshd