开发者社区> 问答> 正文

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

"今天做一个键盘事件的测试,上下左右移动一个小方块,一下是键盘事件监听类: <pre class=""brush:java; toolbar: true; auto-links: false;""> 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());后,运行有时候键盘事件无效,有时候重新运行又有效,能够移动,这是怎么回事阿,有没有人遇到过类似的问题,可否分享一下解决的经验阿~

"

展开
收起
kun坤 2020-06-08 11:12:12 601 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事件."
    2020-06-09 23:20:34
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载