2016-11-16 3 views
1

KeyPressedListenerがキーの押下イベントをフォローアップしたときにこのJLISTオブジェクトの印刷リストインデックスが同期しなくなる理由と解決方法を理解したいと思います問題KeyListenerを使用したときに不正なインデックスがJava 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

このような状況は学術的には興味深いかもしれませんが、JListの選択の変更をリッスンする正しい方法は[addListSelectionListener](https://docs.oracle.com/javase/8)であることを指摘する必要があります。 /docs/api/javax/swing/JList.html#addListSelectionListener-javax.swing.event.ListSelectionListener-)、矢印キーが選択を変更する唯一の方法ではないことは明らかです。 – VGR

答えて

1

keyPressedイベントは以前の選択を返すためです。

ちょうどkeyReleasedイベントからの出力を取得しても問題ありません。キーがダウン

keyReleased():キーが

keyTypedに(起動します):ここでは

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()のより良い説明ですこのキーによって表されるユニコード文字は、キーボードによってシステム入力に として送信されます。

JList内の項目の選択は、キーが表示されたときに発生します。 keyReleased():が起動されると、JListの次の項目が既に選択されます。しかし、keyPressed():イベントはアイテムの選択前に発生します。

+0

ありがとうございます。いつものように、答えは私の顔を見ていた。私はちょうどそれを見ることができませんでした:-) –

+1

あなたは大歓迎です。より良い説明と編集。 – m4heshd

関連する問題