使用复杂的 TableCellRenderer 在 JTable 中格式化来自 JDBC 的数据

Posted

技术标签:

【中文标题】使用复杂的 TableCellRenderer 在 JTable 中格式化来自 JDBC 的数据【英文标题】:Format data from JDBC in JTable with complex TableCellRenderer 【发布时间】:2013-12-15 13:37:38 【问题描述】:

我正在尝试用 Java 实现一个简单的讨论板,但在我的 JTable 中通过 JDBC 显示数据时遇到了一些问题。

我已经创建了一个工作原型,我希望它最终看起来如何

我已通过 JDBC 连接到我的 PostgreSQL 数据库

这里有哪些最佳做法?我应该使用向量吗,TableModel?我似乎找不到任何好的示例代码。

最重要的是:如何在JTable 字段中显示数据库两列的内容?

【问题讨论】:

我不会为此使用JTable,而是使用JList 顺便说一句,我认为您应该在 完全 单独的问题上处理布局和 JDBC,因为它们是不相关的问题(您可以看出,从布局问题可以使用 SSCCE 中的硬编码数据进行排序)。 使用 JList 有什么好处?他们甚至可以为此定制吗? “它们是否足够可定制?” 实现自定义ListCellRenderer,返回包含每个条目详细信息的JPanel。 IE。每个包含“名称+文本/图标+标签”的列表项都可以在面板中表示。 “使用 JList 有什么好处?” 要在 JTable 中表示这一点,需要实现两件有问题的事情。 1)每个项目将跨越两个表行。 2) 表格行会有不同的高度。 -- 对表格数据使用表格,这看起来真的很像一个列表。 【参考方案1】:

您几乎总是想编写自己的 AbstractTableModel 子类。至少,您需要为它编写getRowCountgetColumnCountgetValueAt 方法。通常,表模型基于私有 List(例如private List<BoardMessage> messages)返回数据。

编写自己的模型的好处是每列的类型更容易跟踪,而且出错的空间要小得多。您可以为您的模型类提供额外的方法,例如public void addMessage(BoardMessage message),并且模型可以负责在其 getValueAt 方法中返回适当的值。这比仅仅尝试将东西添加到向量的裸向量中要干净得多,而且更不容易出错。

您的模型类也可以充当数据模型,因为您可以添加像 public BoardMessage getMessageAt(int row) 这样的方法,这在用户对特定消息执行操作时很有用。

在表模型中执行 JDBC 调用不是一个好习惯,因为它们需要时间来执行,并且会阻塞 AWT 事件调度线程,从而导致用户界面变得无响应。更好的做法是在不同的线程中执行 JDBC 选择调用,从 ResultSet 创建数据对象(例如 BoardMessage 实例列表),然后使用EventQueue.invokeLater 使用新数据对象更新您的模型。

【讨论】:

以上是关于使用复杂的 TableCellRenderer 在 JTable 中格式化来自 JDBC 的数据的主要内容,如果未能解决你的问题,请参考以下文章

自定义 TableCellRenderer/TreeTableCellRenderer 不呈现表格单元格

TableCellRenderer用法实践

getTableCellRendererComponent 参数的含义

JButton动作不在JTable中执行

jtable获取列标题组件

更改 JTable 中行的背景颜色