您似乎缺少许多重要的概念。
- 摇摆是事件驱动的环境。这意味着您没有办法(或至少只有很少几种)可以“等待”用户输入,通常,您只需要对他们的交互做出反应即可。
- Swing由单个线程驱动,称为事件调度线程(AKA EDT)。该线程负责将进入应用程序的事件分派/处理到应用程序的适当部分,以便事件可以采取行动。
- 重涂管理器将其更新请求发布到EDT上。
您采取的任何阻止EDT进行这项工作的措施,都会使您的应用程序看起来像挂了一样。
您绝不能
Thread#sleep在EDT上执行任何耗时的 *** 作(例如I / O,循环等),这样做会使您的应用程序“暂停”,这从来都不是很漂亮的。
通读Swing中的并发以获取更多信息。
现在,您有许多选择。您可以使用a
Thread在后台“等待”并向后转卡片,也可以使用a
SwingWorker或a
javax.swing.Timer。
您遇到的另一个问题是,
Thread除EDT之外,切勿更新任何UI组件。这意味着,如果您使用
Thread,则将负责将该线程与EDT重新同步。虽然并不困难,但只是变得凌乱。
SwingWorker并
javax.swing.Timer具有使 *** 作变得更加容易的功能。
线程和
SwingWorker非常适合执行后台处理,并且对于该问题而言简直是过分杀伤力。相反,a
javax.swing.Timer非常适合这里。
if (!Control.model.twoCardsTurned) { if ("unturn".equals(action)) { new Timer(1000, new ActionListener() { public void actionPerformed(ActionEvent evt) { keypadArray[pos].setIcon(back); keypadArray[Control.model.lastCard].setIcon(back); System.out.println("Card: "+pos+" unset"); System.out.println("Card: "+Control.model.lastCard+" unset"); } }).start(); } }
这是一个非常简单的例子。您可能希望添加一些控件,例如,在计时器启动之前,这些控件将阻止用户单击任何内容。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)