Thread.sleep(更改图像)Java

时间:2012-12-11 15:54:39

标签: thread-sleep

我有两个带有图像的jlabels ..当点击另一个时,我尝试更改标签中的图像..(例如游戏).. 我有一个问题..当我写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);
}

}

运行它并首先单击fisrt标签..单击第二个标签后,第一个标签将在1秒内更改图像,但seconf标签为NEVER !!

2 个答案:

答案 0 :(得分:0)

你不应该在这些方法中使用sleep() - 它们是从“事件调度”线程调用的,它处理所有绘图事件。如果你正在睡觉,那么线程就无法重新绘制你的标签。

而不是睡觉,改变你的图像,然后创建一个javax.swing.Timer任务,它将从现在开始1秒钟后再次根据需要更改图像。上面koljaTM的示例使用java.util.Timer,它运行在“错误”的线程中。这是他的代码,修改为使用SWING计时器:

            if (isClicked) {
            try {
                l2.setIcon(new ImageIcon(getClass().getResource("image2.png")));
                javax.swing.Timer timer = new javax.swing.Timer(1000, new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        l2.setIcon(new ImageIcon(getClass().getResource("image1.png")));
                        System.out.println("image2 gone");
                        l1.setIcon(new ImageIcon(getClass().getResource("image1.png")));
                        isClicked = false;
                        isClicked2 = false;
                    }
                });
                timer.setRepeats(false);
                timer.start();
            } catch (final Exception ex) {
                ex.printStackTrace();
            }
        } else {
           ...

答案 1 :(得分:0)

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

                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 {
               ...