如何在JTable单元格中显示动画

我正在寻找一种在表格单元格中显示动画进度指示器(动画GIF,通过Java2D等呈现的旋转轮,此处没有首选项)的方法,直到计算或检索到最终显示的值。

到目前为止,我刚刚将一个静态的“待处理…”文本放入每个尚未准备加速显示的单元格中。 当数据从后台线程到达时,我将其放入适当的单元格并在表格上调用重绘。

使用静态标签或图像,这可以正常工作,但因为单元格渲染仅将其用作橡皮图章的一种,并且不会为每个单元格创建单独的实例(这当然是性能上的好主意),例如动画GIF不是在单个细胞中“玩”。

我怎样才能达到这样的效果? 与仅仅是一个简单的文本相比,它将形成一个更“精致”的UI。

正如你所说,基本的JTable渲染机制不支持这一点,CellRenderer用于绘制单元格(或必要的单元格的一部分),并且不允许重绘,它根据需要绘制。

方法1 – JLayeredPane

如果我需要这样做,我会使用JLayeredPane在JTable上绘制我的动画渲染器。

但是我认为这将是很多工作。 你需要得到很多正确的,特别是如果你在一个滚动窗格内。 你遏制heirarchy会是这样的:

JScrollPane – >(Viewport)JLayeredPane – > JTable&JPanel(透明,带动画)

你也有一个棘手的工作,我们你的动画面板,你需要一个自定义布局管理器来镜像JTable列宽,或使用类似GridLayout的东西。 可行,但很多工作。

方法2 – 自定义CellRenderer并在Swing Timer中重绘

唯一的选择是保留一个动画单元格列表,然后保持一个反复调用重绘的摇摆计时器。 然后,您将拥有一个自定义CellRenderer来进行动画绘制,绘画随时间而变化。 这可能更简单,但在不吃CPU的情况下获得正确的帧速率,并获得重新绘制的更新以匹配动画更新可能会导致一些奇怪的视觉效果

首先,我采用了与Nick Fortescue相同的想法(Method2)。 然而就在那之后我偶然发现了

兔洞博客

作者为动画图标(基于GIF)提供了非常有用的类,以及Java2D绘制的无限进度指示器(着名的Mac OS X,如旋转轮),我可以放入我的应用程序,而不必担心太多的绘画我。

但是,如果我没有找到这些,尼克的方式就是这样。