我试图了解一个Swing应用程序,具体说明表是如何工作的。有一个表从数据库中检索数据并在JTable上显示数据。我查看了代码并确定了如何从数据库中读取数据。
我似乎正在努力解决的一件事是如何在表格上显示数据以及如何更新数据。我知道如何在表上显示数据,但与此表的不同之处在于数据是动态更新的。即,并非所有从数据库中检索的数据都显示在表格中。
看起来应用程序显示了许多行,当用户滚动鼠标或将滚动条移动到表格的底部/末尾时,应用程序会自动更新表格并显示更多数据(我可以看到有发生这种情况时稍有延迟)。
为了能够弄清楚上面是如何实现的,我需要更多关于这种技术的信息,即这种技术被称为什么,以及使用的常用接口/类是什么。
如何实现上述目标的示例链接非常有用,因为我需要先看一个简化版本。
有什么想法吗?
由于
答案 0 :(得分:3)
我不确定这种技术的名称是什么,但我知道它在移动世界中很常见(例如Twitter和Facebook应用程序使用它)。出于实际目的,实现可能是一个普通的JTable,它有一些修改过的组件。
编写您自己的TableModel
来显示数据(这很容易),您可以从任何地方检索信息,并根据需要添加/删除数据。请参阅文档here。您需要实现几种方法
这里重要的主要内容是getRowCount()
方法,您可以在从表中添加/删除数据时更改,以及检索数据的getValueAt()
方法显示在表格中。
TableModel
可能有一个类似于数组的对象(例如ArrayList
),其中包含应该在表中显示的数据。如果要从表中添加/删除数据(即“刷新”),只需在此数组列表对象中添加/删除行,然后在表上触发刷新以获取更改。
或者,如果使用数据库,只要您想显示值,就可以在Cursor
中打开TableModel
打开的数据库getValueAt()
在桌子上。
您需要覆盖其中一个GUI组件,例如JScrollBar
,或者向滚动条添加Listener
,以便它在您尝试滚动到结尾时检测到表,并触发刷新。
在视觉上,如果要在滚动超出表格末尾时显示特殊内容(例如显示“刷新”一词),则需要覆盖当前外观的一些绘画组件。如果你想在它的'高度'添加几个刻度,你还需要覆盖JScrollBar
,这样你就可以实际将滚动条移动到'刷新'部分(仅仅是一个显示器 - 上面的听众应该做实际的刷新工作)
答案 1 :(得分:2)
这种技术称为延迟加载。有一些不同的方法可以使JTable变得懒惰。
实现一个懒惰的表并不像看起来那么容易,因为你将遇到表的不同加载状态。我实现延迟加载表的首选方法(与WATTO Studios描述的稍有不同)是使用/创建一个延迟加载列表作为tablemodel并使用代理对象来触发加载新数据。因此,在初始化表时,不是加载整个数据,而是仅使用代理对象填充表(空数据对象,而只注入原始id)。每当代理对象被要求提供任何值时(例如来自渲染器,只有在行可见时才会发生),您从服务中获取原始数据对象 - 并且可能还要加载下50个对象,避免向服务器询问每一行 - 并用新数据替换代理对象。
乍一看,这看起来很简单,但根据您的数据,它可能会变得非常混乱。例如,当您的数据使用自己引用的外键和类似的东西时。此外,通过在需要时加载数据而不是获得额外的性能,表仍然经常感觉有点慢,因为它只是在需要时加载数据。因此,平衡性能和平滑滚动行为是这里的挑战,以及对数据进行过滤和排序。
使用关键字延迟加载,您应该找到一些有关此主题的示例。
答案 2 :(得分:2)
您的大部分要点(包括JViewport
)已在Christmas Tree Applications
在SSCCE发布后更快获得更好的帮助,但有几种方法,必须决定......,