9

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

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

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

我怎样才能达到这样的效果?它会使用户界面更加“精致”,而不仅仅是简单的文本。

4

2 回答 2

6

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

兔子洞博客

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

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

于 2009-02-22T22:41:25.307 回答
2

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

方法 1 - JLayeredPane

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

但是,我认为这将是很多工作。您需要做很多正确的事情,特别是如果您将它放在滚动窗格中。您的收容层次结构类似于:

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

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

Method2 - 自定义 CellRenderer 并在 Swing Timer 中重绘

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

于 2009-02-22T21:24:40.077 回答