代码之家  ›  专栏  ›  技术社区  ›  Daniel Schneller

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

  •  9
  • Daniel Schneller  · 技术社区  · 17 年前

    我正在寻找一种方法来在表格单元格中显示动画进度指示器(动画gif、通过java2d渲染的旋转轮等,这里没有首选项),直到最终显示的值被计算或检索出来。

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

    对于静态标签或图像,这很好,但由于单元渲染仅将其用作橡皮图章,并且不会为每个单元创建单独的实例(当然,这是一个很好的性能方面的想法),因此动画gif在单个单元中不会“播放”。

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

    2 回复  |  直到 9 年前
        1
  •  2
  •   Nick Fortescue    17 年前

    如您所说,基本的jtable渲染机制不支持此功能,CellRenderer用于绘制单元(或根据需要绘制单元的一部分),并且不允许重新绘制,它根据需要绘制。

    方法1-jlayeredpane

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

    不过,我认为这将是一个很大的工作。你需要做很多正确的事情,特别是如果你把它放在滚动窗格中。你遏制继承权的方式是:

    jscrollpane->(viewport)jlayeredpane->jtable&jpanel(透明,带动画)

    您还需要一个复杂的工作来为动画设置面板,您要么需要一个自定义的布局管理器来镜像jtable列宽,要么使用类似于gridlayout的东西。有能力,但工作很多。

    方法2-在Swing Timer中自定义CellRenderer和重新绘制

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

        2
  •  6
  •   Daniel Schneller    17 年前

    首先,我想到了尼克·福特斯库的想法(方法2)。然而就在那之后,我偶然发现

    The rabbit hole blog

    在这里,作者为动画图标(基于gifs)提供了非常有用的类,以及一个java2d绘制的无限进度指示器(著名的mac os x,类似于spinkingwheel),我可以直接进入我的应用程序,而不必担心自己的绘画太多。

    然而,如果我没有找到这些,尼克的方法就是这样。