JavaFX等待用户输入

时间:2017-05-02 21:53:57

标签: java multithreading javafx

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

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

我为这个描述道歉,已经很晚了。

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

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;
}

显示弹出窗口的代码 这在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 个答案:

答案 0 :(得分:0)

碰撞的方法字面上没有任何东西,它不要求输入,所以它不能工作。

我想,抱歉不好英语

答案 1 :(得分:0)

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

function western_custom_buy_buttons(){

   $product = get_product();

   if ( has_term( 'category1', 'product_cat') ){

   // removing the purchase buttons

                            remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart' );



   remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );

   remove_action( 'woocommerce_simple_add_to_cart', 'woocommerce_simple_add_to_cart', 30 );

   remove_action( 'woocommerce_grouped_add_to_cart', 'woocommerce_grouped_add_to_cart', 30 );

   remove_action( 'woocommerce_variable_add_to_cart', 'woocommerce_variable_add_to_cart', 30 );

   remove_action( 'woocommerce_external_add_to_cart', 'woocommerce_external_add_to_cart', 30 );

   }

}

add_action( 'wp', 'western_custom_buy_buttons' );

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