Java 单击并更改JLabel图标后等待一秒钟

Java 单击并更改JLabel图标后等待一秒钟,java,swing,icons,delay,jlabel,Java,Swing,Icons,Delay,Jlabel,我正在开发我的第一个Swing应用程序。这是一种使用扑克牌的记忆游戏 我使用JLabels模拟卡,并设置正面和背面的图标。每张卡都有一个MouseListener,当用户单击时,我会检查两张卡是否相同。如果它们不是同一张卡,我想将这两张卡显示一到两秒钟,在延迟后,将图标更改回原来的位置 我试着使用sleep,wait,invokeLater,invokeAndWait。。。但什么都不管用 这是我的主要课程: public class Main { public static void

我正在开发我的第一个Swing应用程序。这是一种使用扑克牌的记忆游戏

我使用
JLabel
s模拟卡,并设置正面和背面的图标。每张卡都有一个
MouseListener
,当用户单击时,我会检查两张卡是否相同。如果它们不是同一张卡,我想将这两张卡显示一到两秒钟,在延迟后,将图标更改回原来的位置

我试着使用
sleep
wait
invokeLater
invokeAndWait
。。。但什么都不管用

这是我的主要课程:

public class Main {

    public static void main(String[] args) throws FontFormatException, IOException {

        SwingUtilities.invokeLater(new Runnable() {
          @Override
          public void run() {
              try {
                  MyApp window = new MyApp();
              } catch ( FontFormatException | IOException ex) {
                  Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
              }
          }
        });
    }
}
MyApp
继承自
JFrame
。在其中,我将所有卡添加到一个面板:

while ( cont < cardsInGame.size() ){            
        this.cardsInGame.get(cont).setBounds(x, y, 100, 140);
        panelTablero.add(cardsInGame.get(cont));
        cardsInGame.get(cont).addMouseListener(this);

        x = x+108+5;
        if ( (cont+1)%8 == 0 && cont != 0){
            y = y+140+15;
            x = 53;
        }
        cont++;
}
如果在我的代码中调用
JOptionPane.showMessageDialog(vp,“Wait”)
,一切都会正常工作。图标被刷新,然后等待对话框OK。否则,图标将永远不会刷新(或速度极快且不显示)


我怎样才能增加这个延迟呢?

你有没有试过在这里面放一个therad

        Runnable r = new Runnable() {
          public void run() {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          }
        };
        Thread asd = new Thread(r);
        asd.start();

使用摆动计时器。当定时器启动时,你会重置图标。同时,作为一个可能的例子,谢谢你的程序员。这个例子非常适合我。我已经尝试在我的应用程序,它的工作<代码>线程睡眠(2000)不要阻止EDT(事件调度线程)-发生这种情况时,GUI将“冻结”。不要调用
Thread.sleep(n)
为重复任务执行Swing
计时器,或为长时间运行的任务执行
SwingWorker
。有关更多详细信息,请参阅。如注释中链接的两个示例所示;)
        Runnable r = new Runnable() {
          public void run() {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          }
        };
        Thread asd = new Thread(r);
        asd.start();