Java 如何连接用户界面和功能?
我只是一个Java初学者,到目前为止,我只是将功能放入按钮的Java 如何连接用户界面和功能?,java,swing,jframe,Java,Swing,Jframe,我只是一个Java初学者,到目前为止,我只是将功能放入按钮的addActionListener()方法中,对于小游戏和其他东西来说已经足够了 但现在我正努力使它严肃起来,我想知道如何连接这两个 作为一个例子,我正在制作一个Fuchimi游戏,所以我有我的实际游戏类,然后是一个用所有需要的东西构建框架的类 但我现在的实际问题是,创建帧后,它不会执行以下代码,因为代码会在窗口处暂停,如下所示: FuchimiUI ui = new FuchimiUI(); //The follow
addActionListener()
方法中,对于小游戏和其他东西来说已经足够了
但现在我正努力使它严肃起来,我想知道如何连接这两个
作为一个例子,我正在制作一个Fuchimi游戏,所以我有我的实际游戏类,然后是一个用所有需要的东西构建框架的类
但我现在的实际问题是,创建帧后,它不会执行以下代码,因为代码会在窗口处暂停,如下所示:
FuchimiUI ui = new FuchimiUI();
//The following is not executed
Hand playerHand = null;
while (playerHand == null) {
playerHand = ui.getPlayerHand();
}
Hand enemyHand = generateHand();
ui.changeEnemyText("Enemy picked " + enemyHand.toString());
if (enemyHand.beats(playerHand)) {
ui.changeGenText("Computer wins!");
} else
ui.changeGenText("You win!");
我刚才的按钮改变了玩家的手
那么,当框架已经打开时,如何正确地编译游戏代码呢?我考虑过线程,但我对它们知之甚少,因此我不知道这是否是一个好方法 编辑:
getPlayerHand()方法返回玩家通过按钮选择的手(石头、布或剪刀)。
当然,我可以用按钮的
addActionListener()
方法编写全部代码,但我怀疑这是正确的方法
所以一般来说,我想做的就是让玩家选择他的手牌,然后让游戏生成一个随机手牌,然后比较这两个,并根据玩家是否获胜来更改其中一个标签的文本 您遇到的问题是由于while循环阻塞了UI线程。您需要将其卸载到另一个线程,然后将UI更新重新排队到UI线程上。遇到同样的情况,请看一看 有几种方法可以解决这个问题。其中一个是 这些步骤是:
doInBackground
publish
,以存储中间结果(如要显示的消息)过程
以在UI中显示中间结果涵盖了这一点。尽管我同意多米的答案,即长时间运行的代码应该进入后台线程,但我强烈怀疑,在这种情况下,这不是您需要的,而是您应该重新思考程序的结构。可能您需要的是一个模态对话框,而不是while循环 对于更多更好的建议,请考虑告诉我们游戏逻辑和程序设置的更多细节。例如,首先告诉我们
ui.getPlayerHand()
到底做了什么
您要做的是更改程序的结构,使其成为事件驱动的和基于状态的,其行为根据其状态而变化。例如,如果您的程序处于“手动选择”模式,那么这些按钮或其他用户界面都会对用户做出响应。谢谢,这似乎很有希望,我会仔细看一看,它现在对我来说很有效,也不难理解,所以我接受您的答案。我认为与其尝试将这些代码塞进GUI,也许你应该重新考虑一下。while循环的目的是什么?ui.getPlayerHand()的作用是什么?也许你所需要的只是打开一个模态对话框。这似乎有道理,但你能帮我开始吗?除了与addActionListener()一起工作外,我真的不知道该怎么做。@Big_Chair:不,我希望我能,但我不知道你的游戏规则,你当前的代码,还有很多其他的生活和工作职责。你必须做大部分的工作,如果遇到困难,就带着具体的问题来这里。我建议你也买一本关于面向对象编程概念的书。
SwingWorker
使用了大量的后台线程。不知道你的建议和我的答案有什么不同?你的意思是,他应该在游戏线程和渲染线程之间分离游戏逻辑吗?@Domi:我是说,我认为没有必要使用背景线程。看起来他似乎在等待用户做出选择,然后再继续程序的游戏循环。如果是这样的话,背景线程不是答案,而是将GUI置于获得玩家手的状态。然而,最重要的是,这个问题仍然非常不完整,因此无法给出比猜测多一点的答案。