在密钥监听器运行时允许我的JComponent重绘()

时间:2013-12-21 05:17:43

标签: java multithreading animation keylistener jcomponent

我没有附上任何代码,因为如果你跟着我,我认为没有必要。

我有一个主要类,其中包含JComponent(组件)和JFrame(框架)作为字段。这个类也实现了runnable,一旦线程启动,游戏循环运行,当前该循环中唯一的一行是component.repaint();通常paintComponent()会不断调用,我的窗口会继续顺利更新。我还使用frame.addKeyListener(new MoveListener())向JFrame添加了一个keylistener; (我制作了MoveListener并实现了KeyListener)

唯一的问题是当我点击时说“右”键并按下键被调用。而不是让我的精灵从一个瓷砖跳到另一个瓷砖,让他平稳地一次移动一个像素(我的动画)。为了让精灵在屏幕上居中,当他“向右移动”时,我将地图向左移动。在按下的键中,我有一个for循环,每次从地图的坐标中减去1,直到它到达下一个tile,在这种情况下它会停止移动,所有的坐标都会更新到下一个tile。

我认为keylistener和我的线程将独立运行,但是当调用keypressed时...线程继续运行,但组件没有重新绘制。当for循环运行时,屏幕暂停一会儿,然后精灵跳转到下一个tile。我已经测试并确定线程正在运行并尝试调用repaint(),但是在完成keypressed之后,paintComponent()不会运行。

我认为因为它们是单独的线程,所以当侦听器移动地图时,组件可以继续绘制。有没有理由它在keylistener运行时不会画画,或者我做了别的错误,因为很明显我不是专业人士因此我对这些东西一无所知?还有什么是最好的解决方法...如果需要我上传我的代码,所以你可以看看,但我想我非常彻底解释。感谢所有的帮助!!

1 个答案:

答案 0 :(得分:0)

  

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

建议您阻止事件调度线程,该线程负责处理绘制请求和键事件(以及其他事项)

这意味着当keyPressed中的厕所被执行时,不会处理任何其他内容,包括重绘请求。

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

我建议你做的是在keyPressed事件方法中提出某种标志。然后,您将在游戏线程中监视此标志,并在线程循环的每次迭代中更新映射的状态,直到结束状态满足和/或某种事件更改标志的状态,例如..

你可能想要。请查看Painting in AWT and SwingConcurrency in Swing了解详情

虽然我在这里,但我鼓励您使用key bindings而不是KeyListener,因为它可以更好地控制焦点要求