代码之家  ›  专栏  ›  技术社区  ›  uranibaba

Thread.sleep在前一代码之前激活

  •  1
  • uranibaba  · 技术社区  · 11 年前

    此代码将检查一行中的三个按钮是否具有相同的文本。如果是,它会将这些按钮的颜色更改为绿色,并将int计数器更改为9。当它超过这段代码时,它将重置所有按钮的原始状态,因为计数器==9。

    问题是,它会在按钮变绿之前休眠。为什么?

    int counter = 0;
    
    private void winCheck(String sign)
    {
        if (jButton1.getText().equals(sign))
        {
            if (jButton2.getText().equals(sign))
            {
                if (jButton3.getText().equals(sign))
                {
                    jButton1.setBackground(Color.GREEN);
                    jButton2.setBackground(Color.GREEN);
                    jButton3.setBackground(Color.GREEN);
                    counter = 9;   
                }
    
                try {
                        Thread.sleep(1000);
                    } 
                catch(InterruptedException ex) 
                    {
                        Thread.currentThread().interrupt();
                    }
            }
    }
    
    // This last part to show what I mean with reset.
    counter++;
    
        if (counter == 10)
        {
            jButton1.setBackground(null);
            jButton1.setText(" ");
    
            counter = 0;
        }
    
    1 回复  |  直到 11 年前
        1
  •  1
  •   uranibaba    11 年前

    基里尔·什伦斯基(Kirill Shlenskiy)的回答(请支持他的评论):

    问题是,它将在使按钮变为绿色之前休眠”-这不太可能是真的。请仔细阅读您的代码-我打赌按钮背景颜色值将与您设置后(以及在您点击Thread.sleep之前)的预期值完全相同。您只是看不到更新,因为您的UI线程正忙着等待阻塞thread.sleep调用完成,而没有泵送。您要么需要一个异步替代睡眠(例如计时器),要么需要一种强制UI元素立即重新绘制的方法。Kirill Shlenskiy 7月10日13:38

    我把颜色设置为绿色,但在我把线放进睡眠之前,它没有被画出来?uranibaba 7月11日8:10

    @乌拉尼巴,没错。这是设计的。UI线程在没有其他事情可做时重新绘制UI。thread.sleep不会延迟该方法的其余部分-它会阻止线程,使其在同步工作完成之前无法执行任何其他操作(即重新绘制UI)。Kirill Shlenskiy 7月11日10:43