1

我试图了解一个 Swing 应用程序,特别是表是如何工作的。有一个表从数据库中检索数据并将数据显示在 JTable 上。我浏览了代码并弄清楚了如何从数据库中读取数据。

我似乎在努力解决的一件事是数据如何在表格上显示以及如何更新。我知道如何在表格上显示数据,但与此表格的不同之处在于数据是动态更新的。ie 并非所有从数据库中检索到的数据都显示在表格中。

看起来应用程序显示了许多行,当用户滚动鼠标或将滚动条移动到表格的底部/末尾时,应用程序会自动更新表格并显示更多数据(我可以看到有一点延迟当这种情况发生时)。

为了让我能够弄清楚上述内容是如何实现的,我需要更多关于这种技术的信息,即这种技术称为什么以及使用的常用接口/类是什么。

指向如何实现上述目标的示例的链接将非常有用,因为我需要先查看简化版本。

任何想法?

谢谢

4

3 回答 3

3

我不确定这种技术的名称是什么,但我知道它现在在移动世界中非常普遍(例如 Twitter 和 Facebook 应用程序使用它)。出于实际目的,实现可能是具有一些修改组件的普通 JTable。

  1. 自己编写TableModel来显示数据(这很容易做到),您可以从任何地方检索信息,并根据需要添加/删除数据。请参阅此处的文档。您只需要实现少数几个方法。

    这里重要的主要事情是getRowCount()方法,当您从表中添加/删除数据时您将更改该getValueAt()方法,以及检索要在表中显示的数据的方法。

    可能会有一个类似TableModel数组的对象(例如ArrayList) 包含应在表中显示的数据。当您想从表中添加/删除数据(即“刷新”)时,您只需从该数组列表对象中添加/删除行,然后触发表上的刷新以获取更改。

    或者,如果使用数据库,您可以在要在表上显示值时调用的数据库Cursor中打开一个数据库。TableModelgetValueAt()

  2. 您将需要覆盖其中一个 GUI 组件,例如JScrollBar,或将 a 添加Listener到滚动条,以便它检测您何时尝试滚动超出表格末尾并触发刷新。

  3. 从视觉上看,如果您想在滚动到表格末尾时显示一些特殊的东西(例如显示“刷新”一词),则需要覆盖当前外观的一些绘画组件。如果您想在它的“高度”上添加一些刻度,您还需要覆盖JScrollBar它,以便您可以将滚动条实际移动到“刷新”部分(只是一个显示的东西 - 上面的监听器应该做实际刷新工作)

于 2012-10-23T12:20:20.613 回答
2

这种技术称为延迟加载。有不同的方法可以使 JTable 变得懒惰。

实现惰性表并不像看起来那么容易,因为您将面临表的不同加载状态。我实现延迟加载表的首选方法(与 WATTO Studios 描述的略有不同)是使用/创建延迟加载列表作为 tablemodel 并使用代理对象来触发新数据的加载。因此,不是在初始化表时加载整个数据,而是只用代理对象(空数据对象,而只注入原始 id)填充表。每当向代理对象询问任何值时(例如,来自渲染器,这只会在行变得可见时发生),您从服务中获取原始数据对象 - 并且可能还会加载接下来的 50 个对象,以避免向您的服务器询问每一行 - 并用新数据替换代理对象。

乍一看,这看起来有点简单,但根据您的数据,它可能会变得非常混乱。例如,当您的数据在自己和类似的东西上使用自引用外键时。此外,该表并没有通过仅在需要时加载数据来获得额外的性能,但它仍然经常感觉有点慢,因为它只是在需要时加载数据。因此平衡性能和平滑滚动行为是这里的挑战,以及过滤和排序数据。

使用关键字延迟加载,您应该会找到一些有关此主题的示例。

于 2012-10-23T13:04:47.067 回答
2
于 2012-10-23T13:08:25.337 回答