Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何连接用户界面和功能?_Java_Swing_Jframe - Fatal编程技术网

Java 如何连接用户界面和功能?

Java 如何连接用户界面和功能?,java,swing,jframe,Java,Swing,Jframe,我只是一个Java初学者,到目前为止,我只是将功能放入按钮的addActionListener()方法中,对于小游戏和其他东西来说已经足够了 但现在我正努力使它严肃起来,我想知道如何连接这两个 作为一个例子,我正在制作一个Fuchimi游戏,所以我有我的实际游戏类,然后是一个用所有需要的东西构建框架的类 但我现在的实际问题是,创建帧后,它不会执行以下代码,因为代码会在窗口处暂停,如下所示: FuchimiUI ui = new FuchimiUI(); //The follow

我只是一个Java初学者,到目前为止,我只是将功能放入按钮的
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线程上。遇到同样的情况,请看一看

有几种方法可以解决这个问题。其中一个是

这些步骤是:

  • 覆盖while循环的
    doInBackground
  • 在其中,调用
    publish
    ,以存储中间结果(如要显示的消息)
  • 覆盖
    过程
    以在UI中显示中间结果

  • 涵盖了这一点。

    尽管我同意多米的答案,即长时间运行的代码应该进入后台线程,但我强烈怀疑,在这种情况下,这不是您需要的,而是您应该重新思考程序的结构。可能您需要的是一个模态对话框,而不是while循环

    对于更多更好的建议,请考虑告诉我们游戏逻辑和程序设置的更多细节。例如,首先告诉我们
    ui.getPlayerHand()
    到底做了什么



    您要做的是更改程序的结构,使其成为事件驱动的基于状态的,其行为根据其状态而变化。例如,如果您的程序处于“手动选择”模式,那么这些按钮或其他用户界面都会对用户做出响应。

    谢谢,这似乎很有希望,我会仔细看一看,它现在对我来说很有效,也不难理解,所以我接受您的答案。我认为与其尝试将这些代码塞进GUI,也许你应该重新考虑一下。while循环的目的是什么?ui.getPlayerHand()的作用是什么?也许你所需要的只是打开一个模态对话框。这似乎有道理,但你能帮我开始吗?除了与addActionListener()一起工作外,我真的不知道该怎么做。@Big_Chair:不,我希望我能,但我不知道你的游戏规则,你当前的代码,还有很多其他的生活和工作职责。你必须做大部分的工作,如果遇到困难,就带着具体的问题来这里。我建议你也买一本关于面向对象编程概念的书。
    SwingWorker
    使用了大量的后台线程。不知道你的建议和我的答案有什么不同?你的意思是,他应该在游戏线程和渲染线程之间分离游戏逻辑吗?@Domi:我是说,我认为没有必要使用背景线程。看起来他似乎在等待用户做出选择,然后再继续程序的游戏循环。如果是这样的话,背景线程不是答案,而是将GUI置于获得玩家手的状态。然而,最重要的是,这个问题仍然非常不完整,因此无法给出比猜测多一点的答案。