当前位置: 首页 > 知识库问答 >
问题:

JavaFX 等待用户输入

段干弘毅
2023-03-14

我正在编写一个棋盘游戏,我需要检查玩家正在移动的敌人并提示进行攻击。但是,由于游戏是如何制作的,移动方法是在JavaFX应用程序线程上调用的,我希望能够提示用户是否要与敌人战斗。

我的对话框工作正常,使用等待和通知,在主线程上不工作,会导致程序崩溃,有人知道如何暂停这个线程的执行,直到用户单击其中一个按钮。

我为描述道歉,太晚了。

检查敌人的方法该方法检查敌人,如果用户选择是,则返回敌人。它运行在JavaFX线程上。

private Ship pathBattle(Vector gridPosition){
  //Check if there are ships on the path to the destination
  for(Button cell : activeButtons){
     //Check the button position is not that of the current button, dont go past the current button
     Vector pixPosition = new Vector(cell.getLayoutX(), cell.getLayoutY());
     //Convert to a grid referance
     Vector gridPos = Vector.pixToGrid(pixPosition);
     if(!gridPos.equals(gridPosition)){
        //This button is not the destination

        //Check for any ships on that cell
        Ship collided = Ship.isOccupiedButton(cell);//Returns the ship if there is one on the cell
        if(collided != null){
           //There is a ship, prompt to battle
           boolean battle = UtilPopups.showConfirmationDialog("Do you want to battle " + collided.getName(), "YAR!", "NAY!");

           Game.printError("Ship collision");

           if(battle){
              return collided; //Return the ship to battle
           }
        }
     }

     //On to the next button
  }

  return null;
}

显示Popup的代码这确实适用于porgram的其他区域,没有问题

public static boolean showConfirmationDialog(String lblPrompt, String btnYes, String btnNo){
  //Check if the confirmation controller is not null
  if(confirmationDialog != null){
     confirmationDialog.lbl_prompt.setText(lblPrompt);
     confirmationDialog.btn_no.setText(btnNo);
     confirmationDialog.btn_yes.setText(btnYes);

     //Show the base
     show(confirmationDialog.base_pane);

     //Pause this thread until user input is given from GUI thread
     synchronized (confirmationDialog) {
        try{
           confirmationDialog.wait();
        } catch (Exception e) {
           e.printStackTrace();
        }
     }

     //Program resumed, user input given and stored in response
     if(confirmationDialog.response.equals("yes")){
        confirmationDialog.response = null; //Set back to null
        return true;
     } else {
        confirmationDialog.response = null; //Set back to null
        return false;
     }
  }

  //Class not initialized
  Game.printError("UtilPopups->showConfirmationDialog: Dialog NULL!");
  return false;
}

共有2个答案

司徒骞尧
2023-03-14

碰撞方法实际上什么都不做,它不要求输入,所以它不能工作。

我想,抱歉英语不好

华鹭洋
2023-03-14

用于在显示对话框期间阻止任何呼叫者线程,例如:

static private void showAndBlock(Dialog dialog) {
    if (Platform.isFxApplicationThread()) {
        dialog.showAndWait();
    } else {
        CountDownLatch lock = new CountDownLatch(1);
        Platform.runLater(() -> {
            dialog.showAndWait();
            lock.countDown();
        });
        try {
            lock.await();
        } catch (InterruptedException e) {
            // Just in case you call yourTherad.interrupt(),
            // the thread will be joined forcibly through here.
        }
    }
}

但我不确定它是否适用于您的Thread设计。

 类似资料:
  • 问题内容: 我正在尝试制作一个暂停用户输入的简单命令。我认为在Bash脚本中它将很有用。 这是我的代码: 它甚至不会暂停供用户输入。 我之前尝试过使用getch()(ncurses)。发生的是,屏幕变黑了,当我按下一个键时,它又回到了原来的屏幕上,我看到了: 这是我想要的。但是我想要的只是DOS / Windows 中的命令(我使用Linux)。 问题答案: 从GNU C库手册: 函数:char

  • 我想暂停在JavaFX应用程序线程上执行方法并等待用户与UI交互。不要冻结UI很重要。 例子: 我应该如何实现< code>pause()和< code>resume()方法?< br >事件处理程序的执行应在< code>pause()处等待;调用,直到用户按下< code>resume按钮并且调用< code>resume方法。

  • 问题内容: 我必须为计算机科学课做一个项目。问题是: 图书馆的顾客最多可以借三本书。因此,一个顾客有一个名字和最多三本书。一本书有作者和书名。设计并实现两个类,分别是Patron和Book,以表示这些对象和以下行为: 客户可以实例化带有标题和作者的书 客户可以检查但不能修改书名或作者 客户可以向顾客询问是否借用了给定的书(按书名识别)。 客户可以告诉顾客退还给定的书(按书名识别)。 客户可以告诉顾

  • 我正在尝试为我的频道制作IRC机器人。我希望机器人能够从控制台接收命令。为了让主循环等待用户输入内容,我添加了循环: 这似乎不起作用。我听说过BufferedReader,但我从未使用过,也不确定这是否能解决我的问题。

  • null 所以我面临一个问题,如果打开,等待输入,如何停止它?我尝试过将它放在线程中并或使用作为标志,但它并没有停止

  • 问题内容: 我正在使用Java的扫描仪读取用户输入。如果我仅使用nextLine一次,那就可以了。使用两个nextLine时,第一个不会等待用户输入字符串(第二个会输入)。 输出: X:Y :(等待输入) 我的密码 任何想法为什么会发生这种情况?谢谢 问题答案: 您可能像以前那样调用方法。这样的程序是这样的: 演示您所看到的行为。 问题是不消耗,因此下一个调用将消耗它,然后等待读取的输入。 您需要