首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JTable中显示实体属性值数据?

在JTable中显示实体属性值数据?
EN

Stack Overflow用户
提问于 2009-06-24 17:08:13
回答 1查看 2.4K关注 0票数 1

如何使用JTable来显示和编辑从实体、属性、值(EAV)存储区(关系DBMS)检索的实体的属性属性?

我知道这是一个有很多可能答案的问题,所以请在回答之前先看看下面的要求。

我保证投票给你的答案显示你已经读过并理解了整个事情(只要它们不是完全愚蠢的)。

用户需要能够:

通过attributes

  • Choose显示(作为列的)
  1. 筛选/搜索实体,通过选择的attributes
  2. Edit属性值对实体进行
  3. 排序,
  4. 对所选的entities
  5. (Optional)进行操作,以保存视图以供以后使用。

系统需求:

实体的数量:需要扩展到entities

  • Attributes:的用户可以添加和定义新的属性,系统应该能够处理this

  • Underlying存储: H2数据库(已经设计),通过JDBC

  • 内存进行通信:并不是所有的东西都适合,所以需要从DBMS中提取的查询数应该尽量减少到DBMS所需的查询数量(每个属性可以有一个查询,我有一个表单,每个表视图有一个查询,但是应该需要sucks).

  • Queries:一个查询来生成匹配搜索/筛选器的实体列表)。否则,大量的性能suck.

  • Reusing数据:在添加列时不需要重新查询或重新排序整个列表。

我看过的事物:

  1. 釉面列表库

代码语言:javascript
复制
- Pros:
代码语言:javascript
复制
    - Flexible about column handling
    - Easy to implement sort/filter of entities
    - Flexible about column display format & editing

代码语言:javascript
复制
- Cons:
代码语言:javascript
复制
    - One object per entity (if objects are complex, memory overhead becomes a serious memory problem!)
    - Object responsible for all functionality... but objects should be simple for memory reasons
    - How do I support user-selectable columns without a HashMap for EVERY entity object?

  1. 将AbstractTableModel扩展为将数据从JDBC ResultSet映射到行、列

代码语言:javascript
复制
- Pros:  
    - Paging of results avoids memory problem
    - Searching/Filtering is directly in SQL
    - Memory-friendly, doesn't have to make an object per-row

代码语言:javascript
复制
- Cons:  
    - Implementing custom columns & sorting is a pain (table header renderer, managing sort columns and order, etc)!
    - Probably have to write custom JTableColumnModel too, and this gets messy!
    - Has to manipulate SQL a lot, so if DB schema changes, have to rewrite multiple pieces of code!
    - Hard to maintain entity ID info

  1. ORM

代码语言:javascript
复制
- Pros:  
    - Designed to map DB rows to objects
    - Provides object management

代码语言:javascript
复制
- Cons:  
    - WORST POSSIBLE solution for entity-attribute-value model
    - Have to learn & write ORM code in addition to DBMS & Java code!
    - Entities can have _any_ number of attributes, ORM is only good with static, limited object attributes
    - Lose flexibility/speed of custom SQL

是否有更好的选择,我错过了,或者一些聪明的方法,使釉面列表或自定义表模型更容易?

我已经完全放弃了ORM作为一个选项,因为它与EAV存储有多么糟糕的匹配。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-06-24 17:26:38

我认为最好的选择是“使用JDBC ResultSet的表单映射数据扩展AbstractTableModel”,因为

  • Java 6 JTable内置了对排序的支持,所以您不需要真正实现它。
  • 如果您仔细设计您的模型,您可以保留一些模式更改。代码清晰,如果需要的话,可以让自己更容易地进行更改。

  • ,无论如何,您将不得不回写更改。使用“保存”按钮,批处理更新甚至可以帮助您的performance.
  • You覆盖TableCellEditor来提供组合框,而不是默认的文本编辑器。
  • 不要尝试在一个表中进行所有编辑。

  • ,您可以在运行时向JTable添加/删除列。只有fireTableModelChanged(),新列成为可见的

编辑:是我要做的一件疯狂的事情,我要创建一个自定义组件,并使用位置良好的JTextField和JComboBox来呈现自己,并执行编辑操作。

Edit2:基于您的评论的。在执行消防.()调用之前,保存选定项的位置。顺便说一句,我不认为调用会重置排序或选择--这是没有问题的。

如果添加列,则只需获取新列的键字段和值。在列中显示它们。然后在后台执行隐藏的完全重新加载,并在完成后将模型交换到该模型。这实际上是在一个表中同时从多个ResultSets中运行的。

移除很容易,因为您没有显示该列的值。

Edit3:

DefaultRowSorter没那么深。它为您的记录维护一个重新索引表。因此,当JTable请求第10行时,行排序器将检查其索引表的第十个条目,并从实际模型中检索该indexth元素。

另外,如果模型中有很多相同的字符串,那么在查询数据库中的数据时,可以使用一个简单的字符串映射来缓存字符串。这样,大量多余的字符串对象就可以立即变成GC-d。

Edit4:

我会将新字段查询为键到值的映射,并让我的主模型包含一个键到值的映射列表。然后,我将使用一个getValue()实现,它根据需要从这些附加映射的主数据源返回值。我将从主模型中查找行的键,并使用它从其他映射中检索实际值。(顺便说一句。从接受的答案中获得的声誉不受每日限制。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1039694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档