java - 我是初学者,正在尝试在 netbeans 中制作纸牌翻转游戏

标签 java swing

单击图像时,我希望显示另一幅图像暂停一秒钟,然后恢复原始图像并再次显示再次显示当我尝试执行此操作时,操作处理程序(例如下面给出的代码)会在 sleep 后设置图像。我想暂停显示图像,然后再次显示原始图像,我该如何实现

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"));     }                                         

最佳答案

  • Swing 是单线程的,您永远不应该在事件调度线程的上下文中执行长时间运行或阻塞操作
  • 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了解更多详情

关于java - 我是初学者,正在尝试在 netbeans 中制作纸牌翻转游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47299182/

相关文章:

java - 为什么 DefaultCellEditors 有两种不同的编辑模式?

java - JFrame 大小不正确

java - Horner 的小数部分递归算法 - Java

java - 在线快速手册 : REST API or Java SDK?

java - 使用 Google OAuth2 API 对 Google App 用户进行身份验证

Java:获取对象的唯一属性(如哈希码,但防碰撞)

Java 不调用组件重载的 paintComponent 方法

java - 应用程序在请求位置许可后立即崩溃

java - 在最大化屏幕上调整 JFreeChart.ChartPanel 的大小

java - 最后修改区展开Jtree?