我是初学者,我正试图在netbeans中制作一个卡片翻转游戏

时间:2017-11-15 04:03:53

标签: java swing

单击图像时,我希望显示另一个图像暂停一秒钟,然后再次显示要恢复和显示的原始图像当我尝试这样做时,动作处理程序(如下面给出的代码)会在睡眠后设置图像。我希望暂停显示图像,再次显示原始图像,我该如何实现

private void jButton16ActionPerformed(java.awt.event.ActionEvent evt) {                                           
    jButton16.setIcon(new javax.swing.ImageIcon("C:\\Users\\x\\Documents\\O.png"));  
    try {           //sleep 1 seconds 
        Thread.sleep(1000);
    } 
    catch (InterruptedException e)
    {                   
    }

    jButton16.setIcon(new javax.swing.ImageIcon("C:\\Users\\x\\Documents\\118px-AMIGO.jpg"));     }                                         

2 个答案:

答案 0 :(得分:2)

你永远不应该在Event Dispatch Thread内调用Thread.sleep() 因为Thread.sleep()会阻止事件调度线程,而您的用户界面将会冻结,而您可以使用Timer来实现目标

参考下面的代码,

    jButton16.setIcon(new javax.swing.ImageIcon("C:\\Users\\x\\Documents\\O.png"));
    Timer timer = new Timer(1000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            jButton16.setIcon(new javax.swing.ImageIcon("C:\\Users\\x\\Documents\\118px-AMIGO.jpg"));
        }
    });
    timer.setRepeats(false);
    timer.start(); 

答案 1 :(得分:2)

  • Swing是单线程的,你不应该在Event Dispatching Thread的上下文中执行长时间运行或阻塞操作
  • Swing不是线程安全的,这意味着你永远不应该在EDT的上下文之外更新UI(以及UI需要的任何东西)

解决问题的最简单方法是使用Swing Timer

private void jButton16ActionPerformed(java.awt.event.ActionEvent evt) {                                           
    jButton16.setIcon(new javax.swing.ImageIcon("C:\\Users\\x\\Documents\\O.png"));  
    Timer timer = new Timer(1000, new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            jButton16.setIcon(new javax.swing.ImageIcon("C:\\Users\\x\\Documents\\118px-AMIGO.jpg"));     
        }
    });
    timer.setRepeats(false);
    timer.start();
}         

有关详细信息,请参阅Concurrency in SwingHow to use Swing Timers