Java swing Pin中栅格单元的颜色淡入动画

Java swing Pin中栅格单元的颜色淡入动画,java,swing,animation,grid,artificial-intelligence,Java,Swing,Animation,Grid,Artificial Intelligence,我正在做一个路径发现项目,作为我四年级软件工程学位的一部分。 我们假设为一组多代理寻路算法提供可视化表示。最简单的是适用于多代理的A* 无论如何,我们的环境是一个网格图,其中每个单元都可以被阻止或用作代理路径的一部分。我想做的是使用动画来很好地表示代理的最终移动,但是在我的网格中设置颜色变化的动画。 例如,在路径上的每一步都画上一秒钟左右的颜色,以显示代理如何移动 我想做的另一件事是通过绘制A*算法的开放列表和封闭列表中的变化来表示算法的工作方式 我正在使用observer设计模式的一个改进版本

我正在做一个路径发现项目,作为我四年级软件工程学位的一部分。 我们假设为一组多代理寻路算法提供可视化表示。最简单的是适用于多代理的A*

无论如何,我们的环境是一个网格图,其中每个单元都可以被阻止或用作代理路径的一部分。我想做的是使用动画来很好地表示代理的最终移动,但是在我的网格中设置颜色变化的动画。 例如,在路径上的每一步都画上一秒钟左右的颜色,以显示代理如何移动

我想做的另一件事是通过绘制A*算法的开放列表和封闭列表中的变化来表示算法的工作方式

我正在使用observer设计模式的一个改进版本,将事件从算法层发送到控制器和GUI层。 我想在GUI层中做的是,每次将一个平铺添加到打开列表中时,我都希望将该单元格绘制成某种颜色,然后根据预定义的计时器将其淡出,或者稍后添加一个滑块来控制该计时器

我看了看桌子。这看起来很简单,问题是每个平铺动画都必须独立于其他动画,以允许算法和所有内容保持运行,并启动不同的动画

那么,实现我所期望的结果的最佳方式是什么?我应该为每个动画打开一个不同的线程,还是为每个单元预先制作一个线程? 对于应用程序来说,这是一种过度杀戮,因为最多可以有1000个单元,因此接近1000个线程执行动画

我认为我可能会遇到的另一个问题是,一个单元格可能会启动其褪色动画,然后必须重新启动,我不希望两个动画同时运行(只有一个线程同时为同一单元格执行动画)


如果有人有任何想法或认为它可以真正帮助我完成我的项目,我希望我对我要实现的目标已经足够清楚了。

您可以找到Trident动画库。有关详细信息,请访问您可以找到Trident动画库。在

的更多信息,我会考虑一个只有一个动画线程的场景。例如,您可以尝试以下策略:

  • swing事件的标准事件线程
  • 一个用于逻辑的工作线程
  • 对于所有动画,只有一个附加动画
第三个线程管理gui中的所有动画。因此,它会维护一个要与其时间戳一起执行的动画动作列表。例如,在适当的数据结构中,这种操作可以是“将单元格[1,2]的颜色设置为CF0000@17:01:00”。然后,工作线程使用设置为100%@now的动画动作(例如,您可以一次为衰落单元格-1添加多个动作)填充此动作列表;2) 设置为75%@现在+10秒;3) 设置为50%@现在+20秒。确保此列表已正确同步,因为它将从两个线程访问

如果您将此列表按时间戳排序,则很容易确定此线程在任何时候必须执行的操作。这个线程有一个非常简单的循环,例如

while(true) {
    AnimationAction action = list.get(0);
    if(action!=null && action.timestamp <= now()) {
            action.perform(); // <= be sure that paint events occur in the edt
        list.remove(0);
        continue;
    }
    sleep(...);
}
while(true){
AnimationAction action=list.get(0);

如果(Action!= NULL & Action .TimeStope

)我只考虑一个具有单个动画线程的场景。您可以尝试以下策略:

  • swing事件的标准事件线程
  • 一个用于逻辑的工作线程
  • 对于所有动画,只有一个附加动画
此第三个线程管理gui中的所有动画。因此,它维护一个动画操作列表,以便与它们的时间戳一起执行。此类操作可以是适当的数据结构中的“将单元格[1,2]的颜色设置为CF0000@17:01:00”。此操作列表随后由工作线程用动画操作填充(例如,您可以一次为衰落小区添加多个操作-1)设置为100%@now;2)设置为75%@now+10s;3)设置为50%@now+20s…。请确保此列表已正确同步,因为它将从两个线程访问

如果您将此列表按时间戳排序,则很容易确定此线程在任何时候必须执行的操作

while(true) {
    AnimationAction action = list.get(0);
    if(action!=null && action.timestamp <= now()) {
            action.perform(); // <= be sure that paint events occur in the edt
        list.remove(0);
        continue;
    }
    sleep(...);
}
while(true){
AnimationAction action=list.get(0);

如果(action!=null&&action.timestamp我会使用
javax.swing.Timer
AlphaComposite
,如图所示。

我会使用
javax.swing.Timer
AlphaComposite
,如图所示。

我希望我对我试图实现的目标已经足够清楚直到现在,经过10分钟的编辑,我才明白你贴的那些乱七八糟的信。所以-不。一个技术学位四年级的学生应该能够找到他们的shift键,并在每个句子的开头应用它一次,每次使用“我”这个词。使用像“想要”这样的俚语也无济于事在国际论坛上,很多人都不会理解这个术语。那些做的人会认为你是个傻子,不值得他们注意和时间。请多加小心。“我希望我已经清楚地明白我想要达到的目的。”直到现在,经过10分钟的编辑,我才明白你贴的那些乱七八糟的信。所以-不。一个技术学位四年级的学生应该能够找到他们的shift键,并在每个句子的开头应用它一次,每次使用“我”这个词。使用像“想要”这样的俚语也无济于事在国际论坛上,很多人都不会理解这个术语。那些会认为你是傻子,不值得他们注意和时间的。请TA。