Java 允许我的JComponent在密钥侦听器运行时重新绘制()

Java 允许我的JComponent在密钥侦听器运行时重新绘制(),java,multithreading,animation,keylistener,jcomponent,Java,Multithreading,Animation,Keylistener,Jcomponent,我没有附加任何代码,因为我认为如果你只是跟着做就没有必要了 我有一个主类,其中JComponent组件和JFrame作为字段。这个类还实现了runnable,一旦线程启动,一个游戏循环就会运行,当前该循环中唯一的一行是component.repaint;通常会不断调用paintComponent,并且我的窗口会继续平稳更新。我还使用frame.addKeyListenernew-MoveListener向JFrame添加了一个keylistener;我制作了MoveListener,它实现了Ke

我没有附加任何代码,因为我认为如果你只是跟着做就没有必要了

我有一个主类,其中JComponent组件和JFrame作为字段。这个类还实现了runnable,一旦线程启动,一个游戏循环就会运行,当前该循环中唯一的一行是component.repaint;通常会不断调用paintComponent,并且我的窗口会继续平稳更新。我还使用frame.addKeyListenernew-MoveListener向JFrame添加了一个keylistener;我制作了MoveListener,它实现了KeyListener

唯一的问题是,当我点击说正确的键和按下的键是调用。我没有让我的精灵从一个瓷砖跳到下一个,而是让他一次平滑地移动一个像素,非常快地移动我的动画。为了保持精灵在屏幕上居中,当他向右移动时,我让地图向左移动。在按下键时,我有一个for循环,每次从地图的坐标中减去1,直到它到达下一个磁贴,在这种情况下,它将停止移动,所有的坐标都将更新到下一个磁贴

我想keylistener和我的线程将独立运行,但当keypressed被调用时。。。线程继续运行,但组件没有重新绘制。当for循环运行时,屏幕暂停片刻,然后精灵跳到下一个磁贴。我已经测试过了,我确信线程正在运行并试图调用repaint,但是paintComponent直到按键完成后才运行

我假设,由于它们是独立的线程,因此当侦听器移动地图时,组件可以继续绘制。当keylistener运行时,它不会绘制有什么原因吗?或者我是否做了其他错误的事情,因为很明显我不是一个专业人士,所以我不知道这方面的一切?还有什么是解决这个问题的最好方法…如果需要,我会上传我的代码,这样你就可以看一看,但我想我已经解释得很透彻了。提前谢谢你的帮助

我有一个for循环,它从地图的坐标中减去1

建议您阻止事件调度线程,该线程负责处理绘制请求和关键事件等

这意味着,在执行loo in键时,不会处理任何其他内容,包括重新绘制请求

在您评论您是从一个单独的线程绘制组件之前,实际上您不是。发生的情况是向RepaitManager发出一个绘制请求,它将一个重新绘制请求放入事件队列,然后由事件调度线程处理

我建议您做的是在按键事件方法中升起某种标志。然后在游戏线程中监视此标志,并在线程循环的每次迭代中更新地图的状态,直到结束状态为“满足”和/或某种事件更改标志的状态,例如

你可能会喜欢吃。查看和了解更多详细信息


在这里,我鼓励您使用over KeyListener,因为它可以更好地控制焦点需求

这是一篇很长的文章。看看这篇类似的文章是否有帮助,谢谢,它解释了很多关于它在同一个线程中。。。但是,即使我直接在循环中按键写入重绘,它也不会更新,直到循环结束,我使用了Swingmanager.repaint之类的工具。也许重绘请求调用得太快了,一旦循环完成,它们就会被分组到一个重绘中?即使我让它在循环中睡眠来减缓它的速度,那是因为你仍然阻塞了EDT。重绘请求被添加到事件队列中,因此当循环在密钥侦听器中运行时,EDT无法处理事件队列,这意味着什么也不会发生……然而……重绘管理器经过了高度优化,可以将重绘请求合并为较少的调用,这通常有助于提高swing中重绘的速度。易于理解的不要阻止EDT,使用游戏循环更新UI和EDT/组件的状态,以呈现此状态确定如果没有关键侦听器中的循环,我将如何执行此操作?比如,让关键点设置一个布尔移动为真,然后让它在我的游戏循环的每个周期移动一个像素,直到它到达下一个磁贴,然后将它切换回false或类似的东西,这样线程就可以继续运行了。。。因为一旦我设置了布尔值,按下键就可以终止并释放EDT?我很确定我已经很好地理解了这个概念,可以用它来尝试一些不同的东西。感谢所有的解释和坚持