import java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class TestKey extends JFrame implements KeyListener{
  public TestKey(){
    setSize(200,100);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addKeyListener(this); //<---------------here
  }  public static void main(String[] argv){
    TestKey tk = new TestKey();
  }  public void keyPressed(KeyEvent e){
  }  public void keyReleased(KeyEvent e){
  }  public void keyTyped(KeyEvent e){
    JOptionPane.showMessageDialog(
      null,
      "succeed",
      "Show",
      JOptionPane.INFORMATION_MESSAGE);  }
}

解决方案 »

  1.   

    在main方法里增加一行:public static void main(String[] argv){
        TestKey tk = new TestKey();
        tk.addKeyListener(tk);  //增加这一行。}
      

  2.   

    谢谢两位,不过再问一句,我的程序中在JFrame上面有加了一个JPanel,JPanel上面加一个JButton,为什么又不能响应键盘事件了呢?
    多谢!import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;public class TestKey extends JFrame implements KeyListener{
      public TestKey(){
        JPanel j = new JPanel();
        JButton b = new JButton("button");
        j.add(b);
        getContentPane().add(j);
        addKeyListener(this);
        
        setSize(200,100);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      }  public static void main(String[] argv){
        TestKey tk = new TestKey();
      }  public void keyPressed(KeyEvent e){
      }  public void keyReleased(KeyEvent e){
      }  public void keyTyped(KeyEvent e){
        JOptionPane.showMessageDialog(
          null,
          "succeed",
          "Show",
          JOptionPane.INFORMATION_MESSAGE);  }
    }
      

  3.   

    还是要在main方法中加tk.addKeyListener(tk);
      

  4.   

    不知道你的目的是什么,你修改后的程序运行后,焦点在按钮上面,所以按键事件被提交到按钮,而你的按钮没有add Listener,所以不会有响应import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;public class TestKey extends JFrame implements KeyListener{
      public TestKey(){
        JPanel j = new JPanel();
        JButton b = new JButton("button");
    b.addKeyListener(this); //<----------------here
        j.add(b);
        getContentPane().add(j);
        addKeyListener(this);
        
        setSize(200,100);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      }  public static void main(String[] argv){
        TestKey tk = new TestKey();
      }  public void keyPressed(KeyEvent e){
      }  public void keyReleased(KeyEvent e){
      }  public void keyTyped(KeyEvent e){
        JOptionPane.showMessageDialog(
          null,
          "succeed",
          "Show",
          JOptionPane.INFORMATION_MESSAGE);  }
    }
      

  5.   

    多谢楼上,不过如果我想写一个类似俄罗斯方块的程序, 要实现键盘控制, 应该怎样做呢?
    难道每个控件都要写上addKeyListener?
      

  6.   

    刚刚看了一个程序, 通过在每个可能得到焦点的控件上加了addKeyListener(), 解决了键盘控制的问题. 我试了一下, 可以用了, 有没有什么更好的解决办法吗?怎么才能通过多线程解决? 有没有什么具体的例子?