使用复杂的 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 子类。至少,您需要为它编写getRowCount
、getColumnCount
和getValueAt
方法。通常,表模型基于私有 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 不呈现表格单元格