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

Dan*_*ler 9 java user-interface animation animated-gif

我在寻找一种方法来显示一个动画进度指示器(动画GIF,通过的Java2D等,这里没有偏好呈现的旋转轮)是一个表格单元格,直到将被最终显示已经计算或检索到的值.

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

对于静态标签或图片能正常工作,但由于电池渲染使用此功能只是不大不小的橡皮图章,并且不产生每个细胞单独实例(这当然是一个好主意性能明智)动画GIF例如不不是在单个细胞中"玩".

我怎样才能达到这样的效果?与仅仅是一个简单的文本相比,它会产生一个更"精致"的UI.

Dan*_*ler 6

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

兔洞博客

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

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


Nic*_*cue 2

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

方法1-JLayeredPane

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

不过我认为这会是很多工作。您需要做很多正确的事情,尤其是当您将其放在滚动窗格中时。你的收容层次结构将是这样的:

JScrollPane -> (视口) JLayeredPane -> JTable & JPanel (透明,带动画)

您还需要完成一项棘手的工作来放置动画面板,您要么需要自定义布局管理器来镜像 JTable 列宽度,要么使用 GridLayout 之类的东西。可以做,但是工作量很大。

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

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