【问题标题】:I am a beginner and I am trying to make a card flip game in netbeans我是初学者,我正在尝试在 netbeans 中制作卡片翻转游戏
【发布时间】:2017-11-15 04:03:52
【问题描述】:

单击图像时,我希望显示另一张图像暂停一秒钟,然后恢复原始图像并再次显示当我尝试这样做时,它的动作处理程序(例如下面给出的代码)会在 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"));     }                                         

【问题讨论】:

标签: java swing


【解决方案1】:
  • 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 了解更多详情

【讨论】:

    【解决方案2】:

    你不应该在Event Dispatch Thread 中调用Thread.sleep() 因为 Thread.sleep() 会阻塞 Event Dispatch Thread 并且你的 UI 将是 Freeze ,你可以使用 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(); 
    

    【讨论】:

    • 您也不应该从 UI 上下文之外更新或修改 UI - Swing Timer 将是一个更简单、更安全的解决方案
    猜你喜欢
    • 2023-02-21
    • 2015-09-15
    • 2020-02-03
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    相关资源
    最近更新 更多