当我使用while循环时,JavaFX程序无法启动

时间:2016-07-28 05:37:45

标签: java css user-interface intellij-idea javafx

好的,所以我正在尝试使用JavaFX使用GUI制作基于文本的游戏。在我进入实际的游戏循环之前,一切都很好。虽然一旦我将编码放入游戏循环中,程序就无法启动。它会运行没有错误或异常,但窗口根本不会弹出。当我关闭窗口时,IntelliJ中的所有命令行都是“处理完成后退出代码130”,这显然意味着程序已关闭,因为用户按下Ctrl + C.事实并非如此,因为窗口甚至没有弹出,所以任何用户都无法单击Ctrl + C来终止程序。所以我的问题是我能做什么才能用游戏循环(循环)运行我的程序,而窗口不会弹出。这是我的代码:

<?php
$xml=simplexml_load_file("d2ladder.xml") or die("Error: Cannot create object");
?>    
<table width="100%" border="1" cellspacing="0" cellpadding="2" align="center" style="text-align:center">
  <tbody>
    <tr class="<?php if ($xml->ladder[12]->char[0]->status == "alive") { echo "alive"; } else { echo "dead"; } ?>">
      <td width="10%">1.</td>
      <td width="50%" style="text-align:left"><?php echo $xml->ladder[12]->char[0]->prefix; ?> <?php echo $xml->ladder[12]->char[0]->name; ?></td>
      <td width="10%"><?php echo $xml->ladder[12]->char[0]->class; ?></td>
      <td width="10%"><?php echo $xml->ladder[12]->char[0]->level; ?></td>
      <td width="20%"><?php echo $xml->ladder[12]->char[0]->experience; ?></td>
    </tr>
        <tr class="<?php if ($xml->ladder[12]->char[1]->status == "alive") { echo "alive"; } else { echo "dead"; } ?>">
      <td width="10%">2.</td>
      <td width="50%" style="text-align:left"><?php echo $xml->ladder[12]->char[1]->prefix; ?> <?php echo $xml->ladder[12]->char[1]->name; ?></td>
      <td width="10%"><?php echo $xml->ladder[12]->char[1]->class; ?></td>
      <td width="10%"><?php echo $xml->ladder[12]->char[1]->level; ?></td>
      <td width="20%"><?php echo $xml->ladder[12]->char[1]->experience; ?></td>
    </tr>

  </tbody>
</table>

1 个答案:

答案 0 :(得分:1)

这不应该是游戏循环。按钮单击会触发事件。它应该在那里处理。没有必要一次又一次地更新按钮文本,这就是您目前正在做的事情。

通过在那里执行循环,您可以阻止应用程序线程,该线程负责重绘和处理用户交互,从而无法完成任务。

将您的代码折射为基于事件的,即

用户交互(按钮点击)触发ui更新(状态更改和UI的单次更新)。

E.g。像这样的东西:

public class Game {

    ...

    public void gameStart(){

        ...

        // setting up the scene
        scene = new Scene(window, 800, 600);

        // adding css
        scene.getStylesheets().add(this.getClass().getResource("game.css").toExternalForm());

        setLevel("Storyline");
    }

    public void setLevel(String newLevel) {
         // TODO: integrate gameOn value
         if (newLevel != null && !newLevel.equals(levels)) {
              levels = newLevel;
              switch (levels) {
                case "Storyline":
                    btn1.setText("search around");
                    btn2.setText("turn the light on");
                    btn3.setText("stand in fear");

                    // user interaction triggers setting the level
                    btn2.setOnAction(e -> setLevel("level1"));
                    break;
                case "level1":
                    topText.setText("You turned the light on");
                    break;
            }
         }
    }

    ...

}

其他建议:不要将级别表示为String,将其表示为实现接口的实例:

public interface Level {
     // do updates for level start on game
     void updateGameLevelStart(Game game);

     // cleanup code e.g. unregistering event handlers...
     void updateGameLevelEnd(Game game);
}

这样您就可以将levels的类型更改为Level并简化更新:

public void setLevel(Level newLevel) {
     if (!Objects.equals(levels, newLevel)) {
         if (levels != null) {
              // cleanup old level
              levels.updateGameLevelEnd(this);
         }
         levels = newLevel;
         if (newLevel != null) {
              // start new level
              newLevel.updateGameLevelStart(this);
         }
     }
}

这当然要求您使用Level实现可以访问ui的相关部分。