thread-sleep - Thread.sleep(换图)Java

标签 thread-sleep

我有两个带有图像的jlabel..我尝试在单击另一个标签时更改标签中的图像..(例如游戏).. 我有一个问题..当我编写 Thread.sleep 时,图像没有改变..请参阅代码:

public class Game extends JFrame{
private JLabel l1,l2;;
private boolean isClicked = false ,isClicked2 = false;
public Game(){
    setLayout(new FlowLayout());
    l1 = new JLabel(new ImageIcon(getClass().getResource("image1.png")));
    add(l1);
    l2 = new JLabel(new ImageIcon(getClass().getResource("image1.png")));
    add(l2);


    l1.addMouseListener(new MouseListener() {
        @Override
        public void mouseClicked(MouseEvent e) {}
        @Override
        public void mousePressed(MouseEvent e) {}
        @Override
        public void mouseReleased(MouseEvent e) {
            if(isClicked2){
                l1.setIcon(new ImageIcon(getClass().getResource("image2.png")));
                try {
                    Thread.sleep(1000);
                    l1.setIcon(new ImageIcon(getClass().getResource("image1.png")));
                    l2.setIcon(new ImageIcon(getClass().getResource("image1.png")));
                    isClicked2 = false;
                    isClicked = false;
            }catch(InterruptedException ex){}
            }
            else{
                l1.setIcon(new ImageIcon(getClass().getResource("image2.png")));
                isClicked = true;
            }     
        }@Override public void mouseEntered(MouseEvent e){}@Override public void mouseExited(MouseEvent e){}
    });

    l2.addMouseListener(new MouseListener() {
        @Override
        public void mouseClicked(MouseEvent e) {}
        @Override
        public void mousePressed(MouseEvent e) {}
        @Override
        public void mouseReleased(MouseEvent e) {
            if(isClicked){
              try {
                    l2.setIcon(new ImageIcon(getClass().getResource("image2.png")));
                    Thread.sleep(1000);
                    l2.setIcon(new ImageIcon(getClass().getResource("image1.png")));
                    l1.setIcon(new ImageIcon(getClass().getResource("image1.png")));
                isClicked = false;
                    isClicked2 = false;
              }catch(InterruptedException ex){}  
            }
            else{
                l2.setIcon(new ImageIcon(getClass().getResource("image2.png")));
                isClicked2 = true;
            }     
        }@Override public void mouseEntered(MouseEvent e){}@Override public void mouseExited(MouseEvent e){}
    });
}

public static void main(String[] args) {
    Game g = new Game();
    g.setTitle("Fint the same");
    g.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    g.pack();
    g.setVisible(true);
}

}

运行它并首先单击第一个标签。单击第二个标签后,第一个标签将在 1 秒内更改图像,但第二个标签永远不会!!

最佳答案

图像的更改必须在事件线程(用于处理图形事件的线程)上完成。因此,设置图像将在您的方法返回后将适当的事件排队进行处理。但那时,图像已经变回原样,因为事件线程上的 sleep() 不允许处理任何其他事件。 正如 dashrb 所说,不要 sleep() 主线程,而是在计时器中安排翻转:

                if (isClicked) {

                    l2.setIcon(new ImageIcon(getClass().getResource("image2.png")));

                    new javax.swing.Timer(1000, new ActionListener() {
                        @Override
                        public void actionPerformed(final ActionEvent e) {
                            l2.setIcon(new ImageIcon(getClass().getResource("image1.png")));
                            l1.setIcon(new ImageIcon(getClass().getResource("image1.png")));
                            isClicked = false;
                            isClicked2 = false;
                        }
                    }).start();

                } catch (final Exception ex) {
                    ex.printStackTrace();
                }
            } else {
               ...

关于thread-sleep - Thread.sleep(换图)Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61179092/

相关文章:

java - SCJP 线程 sleep 方法()

.net - VB.net不一致的线程 sleep 定时器

java - actionPerformed 中的线程 sleep

java - Jenkins 在构建和构建后之间挂起

java - 将 repaint() 与 Thread.Sleep() 相结合

JavaGame 角色在绘图时移动不准确?

c# - 我应该始终使用 Task.Delay 而不是 Thread.Sleep 吗?

c++ - 在C++中获取以毫秒为单位的时间差

c++ - 为什么 c++11 sleep_for microseconds 实际上休眠了毫秒?