如何让GUI等待用户输入?

问题描述:

我是一个相当基础的程序员,他被分配到一个GUI程序,没有任何创建GUI的经验。使用NetBeans,我设法设计了我觉得GUI应该看起来像什么,以及按下按钮时应该做些什么,但是主程序在继续之前不会等待用户的输入。我的问题是,我如何让这个程序等待输入?如何让GUI等待用户输入?

public class UnoMain { 

    public static void main(String args[]) { 
     UnoGUI form = new UnoGUI(); // GUI class instance 
     // NetBeans allowed me to design some dialog boxes alongside the main JFrame, so 
     form.gameSetupDialog.setVisible(true); // This is how I'm trying to use a dialog box 

     /* Right around here is the first part of the problem. 
     * I don't know how to make the program wait for the dialog to complete. 
     * It should wait for a submission by a button named playerCountButton. 
     * After the dialog is complete it's supposed to hide too but it doesn't do that either. */ 

     Uno Game = new Uno(form.Players); // Game instance is started 
     form.setVisible(true); // Main GUI made visible 
     boolean beingPlayed = true; // Variable dictating if player still wishes to play. 
     form.playerCountLabel.setText("Players: " + Game.Players.size()); // A GUI label reflects the number of players input by the user in the dialog box. 

     while (beingPlayed) { 
      if (!Game.getCompleted()) // While the game runs, two general functions are repeatedly called. 
      { 

       Player activePlayer = Game.Players.get(Game.getWhoseTurn()); 
       // There are CPU players, which do their thing automatically... 
       Game.Turn(activePlayer); 
       // And human players which require input before continuing. 

       /* Second part of the problem: 
       * if activePlayer's strategy == manual/human 
       * wait for GUI input from either a button named 
       * playButton or a button named passButton */ 

       Game.advanceTurn(); 
       // GUI updating code // 

      } 
     } 
    } 
} 

我花了三天左右,试图找出如何整合我的代码和GUI,所以我会很感激,如果有人能告诉我如何做这件事的工作。如果您需要任何其他信息来帮助我,请询问。

编辑:基本上,教授指派我们用GUI来制作Uno游戏。可以有计算机和人类玩家,其数量由用户在游戏开始时确定。我首先编写了基于控制台的整个系统,以便让游戏的核心工作,并尝试设计GUI;目前这个图形用户界面只显示游戏运行过程中的相关信息,但我不确定如何让代码等待并接收来自GUI的输入,而无需预先对程序进行计费。我调查了其他*问题,如this,this,thisthis,但我无法理解如何将答案应用于我自己的代码。如果可能的话,我想要一个类似于链接中答案的答案(我可以检查和/或使用代码的答案)。我很抱歉,如果我听起来要求苛刻或没有受过教育和困惑;我一直在努力工作这个项目几个星期,现在是明天到期的,而且我一直在强调,因为在我弄清楚之前我无法前进。

TL; DR - 如何让我的主程序等待并收听按钮单击事件?我应该使用模式对话框,还是有其他方法来做到这一点?无论哪种情况,需要更改哪些代码才能实现?

+0

你是什么意思*“等待输入?”* – MadProgrammer 2013-03-10 20:08:48

+0

我希望程序停止并等待用户按下来自GUI的特定按钮前进(我想要等待的区域被指示与块评论)。就像现在一样,代码在while循环中运行并抛出错误,因为用户没有输入他们需要的内容,我不知道如何修复它。 – 2013-03-10 20:25:59

+0

从技术上讲,你不能。您在事件驱动的环境中工作,这意味着您必须对任何可能发生的事件作出响应,你可以使用像模态对话框这样的对话框,直到对话框关闭,这个对话框才会被阻止,但这可能不是你真正想要的 – MadProgrammer 2013-03-10 20:32:30

与基于控制台的编程不同,它通常具有定义良好的执行路径,GUI应用程序在事件驱动环境中运行。事件从外面进来,你对它们做出反应。可能发生的事件类型很多,但通常我们感兴趣的是用户通过鼠标单击和键盘输入生成的事件。

这改变了GUI应用程序的工作方式。例如,您将需要摆脱while循环,因为在GUI环境中这是非常危险的事情,因为它通常会“冻结”应用程序,使其看起来像您的应用程序已挂起(实质上它有)。

相反,您会在您的UI控件上提供严肃的监听器,以响应用户输入并更新某种模型,这可能会影响UI上的其他控件。因此,要尝试回答你的问题,你不要(等待用户输入),应用程序已经是,但你通过侦听器捕获该输入,并根据需要采取行动。

+0

我排除了一些GUI更新代码行,因为我试图通过只显示相关内容来保持清晰; while循环每次都会更新GUI的外观,并自动处理CPU玩家的操作,所以它看起来并不是冻结的,但它真的很快滚动(我不介意只要它运行)。然而,在继续之前,我不知道如何让它等待,并在轮到人类玩家的时候听取人类玩家的动作。 – 2013-03-10 20:46:31

+0

首先,如果你正在使用Swing,使用任何类似这样的循环都有可能阻塞事件分派线程,这是非常危险的事情。我怀疑你已经掌握了它,因为你不尊重[初始线程约束](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。基本上,当一些事件发生时(即用户点击一个按钮),你需要更新游戏状态,这将允许你确定游戏的用户轮流是否转向 – MadProgrammer 2013-03-10 20:58:57

+0

我会很好奇为什么这个会保证一个downvote?它在哪些方面不回答OP问题?在哪些方面可以改进? – MadProgrammer 2017-08-23 05:08:36