【问题标题】:Java: Playing a GIF onceJava:播放一次 GIF
【发布时间】:2018-09-16 12:04:33
【问题描述】:

所以我对 Java 比较陌生,我目前正在尝试制作一个回合制 rpg。我能够将空闲动画添加为 JLabels,当我单击“攻击”按钮时,我希望 attack.gif 播放一次并返回到 idle.gif。有什么办法可以设置吗?

代码示例:

    if(source == menu.attack) {
        //disabling the attack button for the duration of the animation
        menu.attack.setEnabled(false);

        //setting the idle animation to invisible
        menu.idle.setVisible(false);
        //setting the attack animation to visible
        menu.attack.setVisible(true);


        player.attack(enemy, menu);
        update(player, enemy, menu);
        }

【问题讨论】:

  • 一种简单的方法(在我看来:)使用两张图片。 1 个 gif 和 1 个 jpg。当动作(隐藏 jpg 和显示 gif)在几秒钟的超时后隐藏 gif 和显示 jpg)但将其设置为“一个且只有一个动作”..
  • 你不能在动画结束时捕捉到一个事件吗?
  • 如果您知道动画的持续时间,您可以使用它在超时后返回 idle.gif。
  • @Stultuske 我该如何设置?我用 .sleep 方法尝试过,但它只是在我设置的时候冻结了整个 gui。
  • 您永远不应该在 Swing 中“休眠”EDT 线程。一个解决方案,可能是“姿态改变事件”-> 将 JLabel 设置为 GIF 内容,等待“GIF 持续时间”,-> 将 Jlabel 设置为另一个图标。

标签: java swing gif


【解决方案1】:

使用不同的Thread,来控制动画状态;

一个建议:

public void doAttackAnimation(){
   new Thread(()-> {
         setIcon("Your Attack Animation");
         sleep(durationOfAnimation);
         setIcon("default Animation");
      }).start();
}

【讨论】:

  • 这真的很好用!感谢您的快速回答!
  • (1-) 不要为此使用线程。 Swing 组件应在事件调度线程上更新。所以你应该 1) 设置图标。 2)启动一个摇摆定时器 3)当定时器触发你改变图标。或者,如果您真的想使用 Thread,那么对标签的所有更新都需要包装在 SwingUtilities.invokeLater() 中。阅读Concurrency 上的 Swing 教程,了解有关此主题的更多信息。您甚至可以按照教程中的说明使用SwingWorker
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
相关资源
最近更新 更多