在程序中暂停(睡眠) - 似乎没有正常运行?

时间:2013-05-19 20:29:13

标签: java user-interface

我有一个代码,当用户按下按钮时,消息应该显示在文本区域上,并且在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但不确定这意味着什么不好的事情......任何帮助都是值得赞赏的。

1 个答案:

答案 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线程来做什么(有几种方法可以执行此操作,我在这里使用常用的方法)。