1

我有一个代码,当用户按下按钮时,应该在文本区域显示一条消息,并且在 2~3 秒后,它应该消失。

Thread.sleep(milliseconds) 应该这样做,但它似乎不起作用(是的,我在 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(""); 换句话说,它应该去哪里点击>显示>休息>擦除;它确实单击>休息>擦除。

我尝试了其他方法:它正在执行经典的 for(int i = 0; i < 9999999; i++) 类似 20 次的事情,但这与 Thread.sleep() 方式相同。

有任何解决这个问题的方法吗?我读过一些关于将 UI 与 Thread 一起使用很糟糕的文章,但不确定这意味着什么……感谢任何帮助。

4

1 回答 1

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 的其他部分,对鼠标做出反应,等等。

然后新线程唤醒并通过将 Runnable 对象传递给 GUI 线程来告诉 GUI 线程要做什么(有几种方法可以这样做,我在这里使用一种常用的方法)。

于 2013-05-19T20:42:39.740 回答