把按钮去掉就可以监听了,为什么,怎么修改能让有按钮在也可以监听?
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.JFrame;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JPanel;
public class why implements ActionListener,KeyListener{
  JFrame jframe;
  JPanel panel;
  public why(){   
    jframe = new JFrame("why");
    panel=new JPanel();
 jframe.getContentPane().add(panel);
     panel.setLayout(new GridBagLayout());
     JButton why =new JButton("why");
     panel.add(why);
     jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     jframe.setSize(600,400);
     jframe.addKeyListener(this);
     jframe.setVisible(true);
 }
   public void actionPerformed(ActionEvent event){  
   }
  
  public void keyPressed(KeyEvent e){
  System.out.println(" "+e.getKeyChar());
}
public void keyReleased(KeyEvent e){
}
public void keyTyped(KeyEvent e){
}  
  public static void main(String[] args){
     new why();
     }
}

解决方案 »

  1.   

    很简单,你一开始初始化时焦点在JButton why上面,而Button why有没有进行任何时间处理和侦听,肯定没反应,你这个程序是写的焦点在JFrame上的时候才会处理KeyEvent,所以只要在构造函数加一句:
    why.setFocusable(false);
    这样就OK了。
      

  2.   


    import java.awt.*;
    import java.awt.BorderLayout;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.*;
    import javax.swing.JFrame;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import javax.swing.JPanel;public class why implements ActionListener, KeyListener {
    JFrame jframe;
    JPanel panel; public why() {
    jframe = new JFrame("why");
    panel = new JPanel();
    jframe.getContentPane().add(panel);
    panel.setLayout(new GridBagLayout());
    JButton why = new JButton("why");
    panel.add(why);
    jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jframe.setSize(600, 400);
    jframe.addKeyListener(this);
    why.setFocusable(false);//加上这句就行了,原因是焦点在JButton上,所以键盘事件没反应
    jframe.setVisible(true);
    } public void actionPerformed(ActionEvent event) {
    } public void keyPressed(KeyEvent e) {
    System.out.println(" " + e.getKeyChar());
    } public void keyReleased(KeyEvent e) {
    } public void keyTyped(KeyEvent e) {
    } public static void main(String[] args) {
    new why();
    }
    }