java – 正确更新swing组件?
我是新手,任何帮助表示感谢.
在这段代码中,我正在翻牌,如果事实证明他们不匹配,我希望他们再次面朝下. 目前正在发生的事情: 我认为放入睡眠计时器可能会让第二张卡显示一段时间后再转回,但事实并非如此. 我试图使用contentPane.revalidate(); &安培; contentPane.repaint();但它没有改变任何东西. 我已经输入了一些控制台输出: Console output: Card: 0 set Card: 6 set Sleeping now Card: 6 unset Card: 0 unset 上面是单击两张不匹配的卡时产生的控制台输出 @Override public void actionPerformed(ActionEvent e) { String buttonPressed = e.getActionCommand(); int pos = Integer.valueOf(buttonPressed); action = Control.model.ReceiveCardsTurned(pos); keypadArray[pos].setIcon(myIcons[pos]); System.out.println("Card: "+pos+" set"); currentTime.setText("" + Control.model.time); currentScore.setText("" + Control.model.score); //contentPane.revalidate(); //contentPane.repaint(); if(Control.model.twoCardsTurned == false) { if (action == "unturn") { System.out.println("Sleeping now"); try { Thread.sleep(1000); } catch (InterruptedException e1) { e1.printStackTrace(); } keypadArray[pos].setIcon(back); keypadArray[Control.model.lastCard].setIcon(back); System.out.println("Card: "+pos+" unset"); System.out.println("Card: "+Control.model.lastCard+" unset"); } } } 解决方法
您似乎缺少许多重要概念.
> Swing是一个事件驱动的环境.这意味着没有办法(或者至少只有极少数)你可以“等待”用户输入,通常,你只需要对他们的交互做出反应. 您采取的任何阻止EDT执行此工作的操作都会使您的应用程序看起来像是挂起的. 你不能在EDT上执行任何耗时的操作(例如I / O,循环或线程#sleep),这样做会使你的应用程序“暂停”,这从来都不是很好. 阅读Concurrency in Swing以获取更多信息. 现在,您有很多选择.您可以使用线程在后台“等待”并转回卡,或者您可以使用SwingWorker或javax.swing.Timer. 您遇到的另一个问题是,您不应该从EDT以外的任何线程更新任何UI组件.这意味着如果您使用Thread,您将负责将该线程与EDT重新同步.虽然不难,但它变得凌乱. SwingWorker和javax.swing.Timer具有使这更容易的功能. Threads和SwingWorker非常适合执行后台处理,并且对于这个问题只是过度杀伤.相反,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(); } } 这是一个非常简单的例子.您可能希望放置一些控件,以防止用户在计时器触发之前单击任何内容,例如;) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- JavaEE的FirstCup教程问题
- java – 为什么不推荐使用Date.getTimezoneOffset?
- java – 如何在JAX-WS客户端中禁用证书验证?
- java – 为什么不能将Object []转换为String []
- java – 为什么Guava不提供一种转换地图键的方法
- java – 如何在编辑时选择JTable单元格中的所有文本,而不是
- 给出java.lang.IllegalStateException的setRequestProperty
- java – Gradle编译但不运行TestNG测试
- java – 尝试解析json时的NoSuchFieldError“ADJUST_DATES_
- servlet实现文件下载的步骤及说明详解