如何连接UI和功能?

时间:2013-12-01 02:34:53

标签: java swing jframe

我只是Java的初学者,直到现在我只是将功能放入按钮的addActionListener()方法中,这对于小游戏和东西来说已经足够了。

但是现在我正在努力认真对待它,我想知道如何连接那些2。

作为一个例子,我正在制作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!");

按钮我只是改变了玩家的手。

那么我怎样才能正确地做到这一点,在框架已经打开的情况下编译游戏代码? 我想过线程,但我对它们知之甚少,因此我不知道这是不是一个好方法。

修改
ui.getPlayerHand()方法返回玩家通过按钮选择的所选手(摇滚,纸或剪刀)。
当然我可以在每个按钮的addActionListener()方法中编写完整的代码,但我怀疑这是正确的方法。

所以一般来说,我想做的就是让玩家选择他的牌然后让游戏产生随机牌,然后比较这两个牌并更改其中一个牌子的文字,具体取决于牌手赢了或是不。

2 个答案:

答案 0 :(得分:1)

您遇到的问题是因为您的while循环阻止了UI线程。您需要将其卸载到另一个线程,然后将UI更新排入UI线程。遇到同样的情况here,请看一下。

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

步骤如下:

  1. 覆盖{while}循环的doInBackground
  2. 在其中,调用publish来存储中间结果(例如您要显示的消息)。
  3. 覆盖process以在您的用户界面中显示中间结果。
  4. The third page of above mentioned tutorial涵盖了这一点。

答案 1 :(得分:0)

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

有关更多更好的建议,请考虑告诉我们有关游戏逻辑和程序设置的更多详细信息。例如,准确地告诉我们ui.getPlayerHand()的作用,作为一个开始。


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