JPanel 没有获得焦点,按键没有被JPanel监听
在setVisible(true);后面加一句jp1.requestFocus();就行了

解决方案 »

  1.   

    或者把keyListener加到JFrame上
    jp1.addKeyListener(this);改成addKeyListener(this);
      

  2.   

    请问为什么?如果我在主类外新建一个类继承了JPanel后,然后实现了键盘的事件监听,这样编写不用加Jpanel焦点,能够实现键盘按下的效果。你试试。
      

  3.   

    只继承JPanel不可能主动获得焦点,贴出你的代码看一下
      

  4.   

    public class test5  extends JFrame{ /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
        test5 t=new test5();
    }
       public test5()
       {    
       tupian t1=new tupian();       //将面板加入到窗体。
       this.add(t1);
       this.addMouseListener(t1);  //窗体是事件源,面板是事件的监听者。
       this.addKeyListener(t1);
       this.setSize(500,500);
       this.setTitle("画图程序");
       this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
       this.setLocation(300,200);
       this.setVisible(true);
       
       }
    }
    class tupian extends JPanel implements KeyListener,MouseListener
    {
    public void paint(Graphics g)
    {
    super.paint(g);
    g.setColor(Color.red);
    g.fillRect(0, 0, 500, 200);
    } @Override
    public void mouseClicked(MouseEvent arg0) {
    // TODO Auto-generated method stub

    } @Override
    public void mouseEntered(MouseEvent arg0) {
    // TODO Auto-generated method stub
    System.out.println("鼠标进入了JPanel");
    } @Override
    public void mouseExited(MouseEvent arg0) {
    // TODO Auto-generated method stub
    System.out.println("鼠标离开了JPanel");
    } @Override
    public void mousePressed(MouseEvent arg0) {
    // TODO Auto-generated method stub

    } @Override
    public void mouseReleased(MouseEvent arg0) {
    // TODO Auto-generated method stub

    } @Override
    public void keyPressed(KeyEvent arg0) {
    // TODO Auto-generated method stub
    System.out.println(arg0.getKeyChar()+"键被按下");
    } @Override
    public void keyReleased(KeyEvent arg0) {
    // TODO Auto-generated method stub

    } @Override
    public void keyTyped(KeyEvent arg0) {
    // TODO Auto-generated method stub

    }


    }
    请高手,看一下这部分代码,我运行后,能发生键盘按下事件。这段代码没有加入焦点,但是能运行,我现在是弄不清他的机制是什么?窗体类为什么必须要专门编写获取焦点才能发生键盘事件呢?
      

  5.   

    this.addKeyListener(t1);
    这个的keyListener就是JPanel本身,所以可以
      

  6.   

    什么叫所以可以??上面头一段代码中的 jp1.addKeyListener(this);这个也没有错啊,jp1是事件源,this是事件的监听者,代码没有问题啊,鼠标事件都能监听成功,而且也没有写专门的焦点。怎么就key事件没有反应了呢?