首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数调用会阻止GUI在java中进行更新

函数调用会阻止GUI在java中进行更新
EN

Stack Overflow用户
提问于 2017-07-13 09:25:50
回答 2查看 180关注 0票数 1

我目前正在用java实现一个quoridor游戏,使用AI游戏算法。在“人类”点击移动后,gui需要更新,AI开始思考。我在面板里有类似这样的东西:

代码语言:javascript
复制
public void mouseClicked(MouseEvent e)
    {
       gameBoard.executeMove( movePawn );
       repaint();
       gameboard.callAi();
    }

在调用函数callAi()之后,我进入了一个耗费太多时间才能完成的循环中。另一方面,gui冻结,它不更新,即使在AI“开始思考”之前调用了重绘方法。我试着在呼叫AI之前延迟一下,但它不起作用。我写了这个:

代码语言:javascript
复制
try
{ TimeUnit.MILLISECONDS.sleep(5);}
catch{}

我能做些什么来解决这个问题?也许这与线程有关,但我对Java中的线程并不是很友好。

EN

回答 2

Stack Overflow用户

发布于 2017-07-13 17:26:06

我强烈建议阅读一下什么是EDT (Event Dispatch Thread)。

Java Event-Dispatching Thread explanation

其中一个答案很好地解释了这一点。Quick TLDR:基本上,图形用户界面冻结的原因之一是因为您在EDT中包含的AI方法(关于gameBoard.executeMove(...),我不能肯定地说)方法)。EDT用于更新GUi,而不是运行耗费大量计算时间的方法。

将游戏逻辑代码从GUI中取出并放入主线程/新线程(而不是EDT)。如果您绝对需要在EDT中使用游戏逻辑,那么在EDT中创建一个新的线程,让它进行游戏计算,最后使用Swing.Utilties.invokeLater(...)方法来更新GUI。

也许它与线程有关,但我对

中的线程并不是很友好。

当你做游戏的时候,一定要熟悉线程,尤其是EDT。

票数 2
EN

Stack Overflow用户

发布于 2017-07-13 18:50:59

你应该使用SwingWorker来完成这方面的AI工作。所有的更新和处理都是在Swing中的一个线程上进行的,所以如果你阻塞它,那么你就会冻结UI。

https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

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

https://stackoverflow.com/questions/45069984

复制
相关文章

相似问题

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