首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >允许我的JComponent在键侦听器运行时重新绘制()

允许我的JComponent在键侦听器运行时重新绘制()
EN

Stack Overflow用户
提问于 2013-12-21 05:17:42
回答 1查看 468关注 0票数 0

我没有附加任何代码,因为我不认为如果你只是跟随它是没有必要的。

我有一个主类,其中JComponent (组件)和JFrame (框架)作为字段。这个类还实现了runnable,一旦线程启动,游戏循环就会运行,目前该循环中唯一的行是component.repaint();通常paintComponent()经常被调用,我的窗口继续顺利更新。我还使用JFrame (新的MoveListener ())向MoveListener添加了一个键侦听器;(我创建了MoveListener,它实现了KeyListener)

唯一的问题是,当我按下“右”键时,按下的键就会被调用。而不是让我的精灵从一个瓷砖跳到下一个im,让他一次平稳地移动一个像素,非常快(我的动画)。为了保持精灵在屏幕上的中心位置,当他“向右移动”时,我会让地图向左移动。在按下键时,我有一个for循环,每次从地图坐标中减去1,直到它到达下一个平铺为止--在这种情况下,它将停止移动,所有的坐标都会更新到下一个块。

我想键盘监听器和我的线程会独立运行,但是当按键被调用时.线程继续运行,但组件没有重新绘制。屏幕暂停片刻,因为for循环通过,然后雪碧跳到下一个瓷砖。我已经测试并确定线程正在运行,并试图调用repaint(),但是paintComponent()直到键压完成后才会运行。

我认为,由于它们是单独的线程,所以组件可以在侦听器移动映射时继续绘制它们。在关键侦听器运行时,它不作画是有什么原因的吗?还是我做错了什么,因为我不是一个行为者,所以我不知道这件事的一切?另外,要想绕过this...if,最好的方法是我会上传我的代码,这样你就可以看一看,但我想我已经解释得很透彻了。谢谢大家提前帮忙!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-21 05:36:08

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

建议您阻塞事件分派线程,该线程负责处理画图请求和关键事件(除其他事项外)。

这意味着在执行keyPressed中的loo时,将不处理任何其他内容,包括重绘请求。

在您评论您正在从一个单独的线程绘制组件之前,实际上不是。所发生的是向RepaintManager发出一个画图请求,该请求将一个重绘请求放置到事件队列中,然后由事件分派线程处理

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

你可能想要。有关更多细节,请参阅AWT和Swing中的绘画在Swing中并发

在这里,我鼓励您使用键绑定而不是KeyListener,因为它可以更好地控制焦点需求

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20715733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档