package person.move;import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
 
 import javax.swing.*;
 public class KeyListener1 extends   JFrame 
implements   ActionListener   {
public JButton b1=new JButton("确定"); 
 
public int x;
public int y;
    public JPanel jpanel=new JPanel();
public JFrame frame = new JFrame("键盘响应");
public void _int()

{ this.x=110;
this.y=180;

     frame.setLocation(300, 300);
     frame.setSize(300, 300);
     frame.setResizable(false);
     frame.setVisible(true);
     frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
     
     frame.setContentPane(jpanel);
     jpanel.setBackground(Color.GREEN);
     
     jpanel.setLayout(null);
     jpanel.add(b1);
      
     b1.setBounds(this.x, this.y, 80, 25);
     
     b1.addActionListener(this); 
     //addMouseListener(new Move().m);
    
     
     jpanel.setFocusable(true);
     jpanel.addKeyListener(new KeyAdapter(){
      public void keyPressed(KeyEvent e){    
      if(e.getKeyCode()==KeyEvent.VK_RIGHT)
       b1.setBounds(++x, y, 80, 25);
        if(e.getKeyCode()==KeyEvent.VK_LEFT)
       b1.setBounds(--x,y, 80, 25); 
        if(e.getKeyCode()==KeyEvent.VK_UP)
       b1.setBounds(x,--y, 80, 25); 
       if(e.getKeyCode()==KeyEvent.VK_DOWN)
       b1.setBounds(x,++y, 80, 25);
     
       }
     });      }

    
 public static void main(String[] args){
     KeyListener1 move=new KeyListener1();
     
     move._int();
     
  }
  @Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub

}
}
程序是做了一个键盘监视,用上下左右键可以移动按钮的位置,刚进去程序是键盘监听可以实现,为什么我单击一下按钮后,键盘监听就不能执行了呢?是不是按钮的响应屏蔽了键盘监听啊?该怎么做才不会这样子啊?

解决方案 »

  1.   

    你点击鼠标后,焦点就未必落在你所监听的控件上面了,那么这个控件就监听不到任何键盘事件了,因为这些事件全都发给“焦点所在控件”了。一种解决方案是,提升监听的级别,比如直接重写JFrame的processKeyEvent()函数(它相当于事件的分发者),不过要注意处理完毕后要调用super.processKeyEvent();不然全都没反应了。
      

  2.   

    b1.addActionListener(this);           
             
             jpanel.setFocusable(true);     //不是给jpanel加监听 是给b1加监听
             jpanel.addKeyListener(new KeyAdapter(){
                 public void keyPressed(KeyEvent e){            
                     if(e.getKeyCode()==KeyEvent.VK_RIGHT)
                          b1.setBounds(++x, y, 80, 25);        
                       if(e.getKeyCode()==KeyEvent.VK_LEFT)
                          b1.setBounds(--x,y, 80, 25); 
                       if(e.getKeyCode()==KeyEvent.VK_UP)
                          b1.setBounds(x,--y, 80, 25); 
                      if(e.getKeyCode()==KeyEvent.VK_DOWN)
                          b1.setBounds(x,++y, 80, 25);
                     
               }
             });按照你说的 键盘才是事件源,但是你给jpanel加了键盘监听.............
    另外给b1加了个actionListener完全没有必要。把b1.addActionListener(this);   这一句去掉
    jpanel.addKeyListener改成b1.addKeyListener
      

  3.   

    我是监听jpanel里面的键盘响应,给jpanel加监听不对吗?
      

  4.   


    不是对和错的问题,是丧失焦点的问题为了加深你的理解,你这么简单修改下:
    @Override
    public void actionPerformed(ActionEvent e) {
        jpanel.requestFocus(); // 让jpanel重获焦点
    }
    就可以看到效果了,但这不是解决问题最合适的方法。
    楼主还是多Google了解了解关于事件捕获机制吧
      

  5.   

    再问一下,当按钮监听结束后,有什么方法可以让焦点回到jpanel上啊?
      

  6.   


    就是这句话啊,我晕:
      jpanel.requestFocus();