2015-09-05 100 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

首先,您不应该为Swing应用程序使用KeyListeners。请看看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

*“首先,您不应该为Swing应用程序使用”KeyListeners“。”*我不需要在投票前进一步阅读任何内容。 –

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();