开发者社区> 问答> 正文

JFrame添加KeyListener的时候,有时候有效,有时候又无效- java报错

今天做一个键盘事件的测试,上下左右移动一个小方块,一下是键盘事件监听类:

 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());后,运行有时候键盘事件无效,有时候重新运行又有效,能够移动,这是怎么回事阿,有没有人遇到过类似的问题,可否分享一下解决的经验阿~

展开
收起
montos 2020-05-30 13:56:06 1129 0
1 条回答
写回答
取消 提交回答
  • "

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

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

    ######跟焦点有关吧
    ######

    引用来自“hunterli”的答案

    跟焦点有关吧
    可能是,但是具体原理不是很明白
    ######是否多工處理時hand住了, bodyPanel.repaint 要放到另一個 thread, 才可以讓 KeyMonitor 繼續不斷的Listen事件." ![image.png](https://ucc.alicdn.com/pic/developer-ecology/cf3843478a6b473bb508760d5a59f91a.png)
    2020-05-30 14:22:21
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载