2015-09-05 3 views
0

У меня есть следующий код. Мне нужно напечатать сообщение, когда я нажимаю стрелку вправо. Но когда я нажимаю VK_RIGHT, ключевой прослушиватель не запускается. Он не печатает сообщение, которое предполагается напечатать. Любые идеи почему?KeyListener не прослушивает

public class AutoClicker implements KeyListener{ 

     public static int rate = 0; 
     static boolean keep = true; 

    public static void main(String[] args) { 
     AutoClicker clicker = new AutoClicker(); 
     JFrame frame = new JFrame(); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(new Dimension(200,300)); 
     frame.setVisible(true); 

     frame.setFocusable(true); 
     frame.requestFocus(); 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 
; 
    @Override 
    public void keyPressed(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
      keep = false; 
      System.out.println(keep); 

      //System.out.println("Right key typed"); 
     } 
     if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
      System.out.println("Left key typed"); 
     } 

     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 
} 
+0

Вы уже искали форум? Например, посмотрели ли вы в разделе «Связанные» в правой части страницы на другие вопросы по этой теме? – camickr

ответ

2

Прежде всего, вы не должны использовать KeyListeners для Swing-приложений. Пожалуйста, взгляните на How to Use Key Bindings. Теперь к вашей основной проблеме:

Вы не добавили KeyListener к раме, поэтому он не работает. Так что добавьте frame.addKeyListener(this); (или, в идеале, на панель, в которой вы хотите прослушать ключ), и она будет работать. Однако вы не можете сделать это в статическом контексте, поэтому я бы предложил создать кадр внутри конструктора. (и при вызове new AutoClicker()только в основном способе). Вы можете также использовать решение в другом ответе, но я предпочитаю это так: P

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 

public class AutoClicker implements KeyListener { 

    public static int rate = 0; 
    static boolean keep = true; 

    public AutoClicker() { 

     JFrame frame = new JFrame(); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(new Dimension(200, 300)); 
     frame.setFocusable(true); 
     frame.addKeyListener(this); 
     frame.requestFocus(); 
     frame.setVisible(true); 

    } 

    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new AutoClicker(); 
      } 
     }); 

    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    }; 

    @Override 
    public void keyPressed(KeyEvent e) { 

     if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
      keep = false; 
      System.out.println(keep); 

      System.out.println("Right key typed"); 
     } 
     if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
      System.out.println("Left key typed"); 
     } 

     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     // throw new UnsupportedOperationException("Not supported yet."); //To 
     // change body of generated methods, choose Tools | Templates. 
    } 

} 
+1

* «Прежде всего, вы не должны использовать« KeyListeners »для приложений Swing.» * Мне не нужно читать дальше до голосового голосования. –

1

Вы должны добавить KeyListener к раме. Просто обновите свой основной метод в соответствии со следующим кодом.

AutoClicker clicker = new AutoClicker(); 
    JFrame frame = new JFrame(); 
    frame.addKeyListener(clicker); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(new Dimension(200,300)); 
    frame.setVisible(true); 

    frame.setFocusable(true); 
    frame.requestFocus();