JFrame添加KeyListener的时候,有时候有效,有时候又无效

无名人士 发布于 2011/08/31 21:10
阅读 1K+
收藏 0
今天做一个键盘事件的测试,上下左右移动一个小方块,一下是键盘事件监听类:
 private class KeyMonitor extends KeyAdapter {

  @Override
  public void keyPressed(KeyEvent e) {
   // TODO Auto-generated method stub
   tank.keyPressed(e);
   //System.out.print("press");
   tank.move(body.getBounds());
   body.repaint();
   //tank.move(body.getBounds());
  }

  @Override
  public void keyReleased(KeyEvent e) {
   // TODO Auto-generated method stub
   body.repaint();
   tank.keyReleased(e);
  }

  @Override
  public void keyTyped(KeyEvent e) {
   // TODO Auto-generated method stub
   //tank.keyPressed(e);
  }
  
 }

里面的tank是我要用小方块模仿的坦克对象,body是tank移动的JPanel区域,但是前面addkeyListener(new KeyMonitor());后,运行有时候键盘事件无效,有时候重新运行又有效,能够移动,这是怎么回事阿,有没有人遇到过类似的问题,可否分享一下解决的经验阿~

加载中
0
无名人士
无名人士

原因是找出来了,但不是很理解:
  //add(buttonPanel,BorderLayout.SOUTH);将这里注释掉就可以了,无论什么时候重新运行都能监听
  bodyPanel.addTank(tank);
  bodyPanel.repaint();
  add(body,BorderLayout.CENTER);
  addKeyListener(new KeyMonitor());

其实我的JFrame包括两部分,一个bodyPanel,tank在里面移动,一个buttonPanel添加一个start和stop按钮,但是加了buttonPanel之后不知道为什么keyevent的监听时有时无,将它注释掉后就解决了,希望有人能帮忙解释一下原因~

0
hunterli
hunterli
跟焦点有关吧
0
无名人士
无名人士

引用来自“hunterli”的答案

跟焦点有关吧
可能是,但是具体原理不是很明白
0
Y
YehAlice
是否多工處理時hand住了, bodyPanel.repaint 要放到另一個 thread, 才可以讓 KeyMonitor 繼續不斷的Listen事件.
返回顶部
顶部