Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在thread.sleep()之前未更新边框格式_Java_Multithreading_Awt_Sleep_Event Dispatch Thread - Fatal编程技术网

Java 在thread.sleep()之前未更新边框格式

Java 在thread.sleep()之前未更新边框格式,java,multithreading,awt,sleep,event-dispatch-thread,Java,Multithreading,Awt,Sleep,Event Dispatch Thread,希望我的第一个问题不是太明显或者研究得不好。下面的代码来自MouseListener的mouseClicked事件。我希望将边框颜色更改为绿色,以向用户显示他/她单击的内容,启动睡眠计时器,然后将其更改为黑色。不幸的是,更改只在Thread.sleep之后发生(可能还有很多方法)。目前,对变回黑色的更改进行了注释,颜色更改确实会变为绿色(永久性)。如果没有注释,则没有可见的颜色变化。这是怎么回事 谢谢 JLabel myLabel = (JLabel) e.getSource();

希望我的第一个问题不是太明显或者研究得不好。下面的代码来自MouseListener的mouseClicked事件。我希望将边框颜色更改为绿色,以向用户显示他/她单击的内容,启动睡眠计时器,然后将其更改为黑色。不幸的是,更改只在Thread.sleep之后发生(可能还有很多方法)。目前,对变回黑色的更改进行了注释,颜色更改确实会变为绿色(永久性)。如果没有注释,则没有可见的颜色变化。这是怎么回事

谢谢

    JLabel myLabel = (JLabel) e.getSource();
    myLabel.setBorder(BorderFactory.createLineBorder(Color.green));

    try {
        Thread.sleep(2000);
    } catch (InterruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    //myLabel.setBorder(BorderFactory.createLineBorder(Color.black));

如果您在事件分派线程中休眠,则会阻止它执行其工作,即重新绘制GUI并显示刚刚设置的边框。您只需将整个GUI冻结2秒钟


您需要使用swing计时器,并让该计时器在2秒后将边框重置为其原始颜色。睡眠必须在另一个线程中完成,然后边界必须在EDT中更改。这就是Swing Timer为您所做的。

有点困惑-当用户单击JLabel时,您希望将边框更改为绿色,但何时将边框更改为红色?您是否尝试过增加延迟时间?谢谢JB,计时器是解决方案。虽然我的初衷只是想表明JLabel被按下,但鼠标按下和鼠标松开的侦听器实际上是一个更好的解决方案。此外,我还需要阅读更多关于线程和内容的文章。