我有一个代码,当用户按下按钮时,消息应该显示在文本区域上,并且在2~3秒后,它应该消失。
Thread.sleep(毫秒)应该这样做,但它似乎不起作用(是的,我在try / catch和所有内容中都有它)。 这是我的倾听者:
private class moveListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
CardLayout cl = (CardLayout)(cards.getLayout());
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 3; j++)
{
if(e.getSource() == move[i][j])
{
turn++;
if(turn == 4)
turn = 0;
text.setText(""+SPRITES[i]+" has used " + move[i][j].getText() );
try {
Thread.sleep(3000);
} catch (InterruptedException ex) { }
text.setText("");
cl.show(cards, MAIN);
}
}
}
}
当我运行它时,我可以感觉整个程序冻结(可能是由于sleep()方法),但它跳过text.setText(theMessage)并直接转到text.setText(“”); 换句话说,它应该去哪里点击&gt;显示&gt;休息&gt;抹去;点击&gt;休息&gt;擦除。
我已经尝试过其他方法:对于(int i = 0; i&lt; 9999999; i ++)这样做的经典事情就像20次那样,但这与Thread.sleep()方式完全相同。
有什么方法可以解决这个问题?我已经读过一些关于在线程中使用UI但不确定这意味着什么不好的事情......任何帮助都是值得赞赏的。
答案 0 :(得分:0)
text.setText(""+SPRITES[i]+" has used " + move[i][j].getText() );
Thread t = new Thread(){
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException ex) { }
SwingUtilities.invokeLater( new Runnable() {
text.setText("");
cl.show(cards, MAIN);
} );
}
};
t.start();
通常的模式是:
有“GUI线程”或EDT,或者您想要调用它。
GUI线程对GUI做了一些事情。
然后它会启动一个等待一段时间的新线程。
在GUI线程之间可以渲染GUI的其他部分,对鼠标做出反应等等。
然后新线程唤醒并告诉GUI线程通过将Runnable对象传递给GUI线程来做什么(有几种方法可以执行此操作,我在这里使用常用的方法)。