【问题标题】:JTable vs. list of JPanels in JScrollpaneJTable 与 JScrollpane 中的 JPanel 列表
【发布时间】:2011-05-13 22:34:26
【问题描述】:

(已编辑)

我想显示一个包含用户可以修改的文本字段的 JPanel 的动态列表。我无法决定如何设计我的 GUI。我应该在 JTable 还是 JScrollPane 中显示每个 JPanel?

据我了解,JTable 方法内存效率更高、速度更快,因为我有 getTableCellRenderer 方法,它使用缓存的 JPanel 来显示表格单元格的数据(编辑:我没有将 JPanel 存储在我的表格中,只是数据)。 getTableCellEditor 方法调用相同的缓存 JPanel 来捕获用户的输入。捕获输入后,数据将更新到表中。我不确定如何允许用户在单元格渲染器再次接管之前修改此临时 JPanel 的多个组件(文本字段)。我解决这个问题的唯一方法是创建一个弹出对话框来捕获所有信息,一旦用户完成将数据存储回表。 (我认为这会停止表格单元格的渲染过程,还不确定。)

另一种方法是创建 JPanel 并将其添加到 JScrollPane。但是,这意味着我不仅要存储原始数据(整数、字符串等),而且还要使用更多内存,因为我要创建这么多 JPanel 对象。这显然是更简单的方法;但是,如果我的列表很大,那么我相信我会在性能上看到一些命中。

我喜欢 JTable 的设计;但是,我讨厌这样一个事实,即当需要编辑单元格时,我需要弹出一个窗口来捕获输入。我不知道,我可能只是简单地使用 JScrollPane 设计。

这听起来对吗?还是我遗漏了有关 getTableCellEditor 进程如何工作的一些信息?

【问题讨论】:

  • Dacwe,也许您误解了,或者您不完全了解 JTables 的工作原理。 JPanel 通过 getTableCellRenderer 方法显示。我使用原始数据更新组件并返回 JPanel 对象。 JPanel 对象随后显示为表格中的一个单元格。
  • 这是您的设计,而不是表格的工作方式。表格不适用于面板,它们适用于数据。

标签: java swing


【解决方案1】:

我喜欢 JTable 的设计;但是,我讨厌这样一个事实,即当需要编辑单元格时,我需要弹出一个窗口来捕获输入

您是否阅读过 JTable API 并按照“如何使用表格”的 Swing 教程链接获取工作示例?您不必创建弹出编辑器。单元格已就地编辑。

对于表格中的按钮,您需要一个自定义编辑器。您可以查看表格按钮列以了解执行此操作的一种方法。

【讨论】:

  • 感谢您的回复。是的,我查看了 API,似乎对象的范围只保留在用户完成他/她的操作之前。例如当用户单击单元格时,将调用 getTableCellEditor 并返回单元格对象(在本例中为 JPanel)。一旦操作完成,对象就会被移除。
  • 对不起,我想添加一个新的段落...还没有发布。继续:如果我希望用户编辑多个组件,那么每次用户单击单元格的子组件时都会调用 getTableCellEditor。
  • 这是否意味着对于单元格中的每个组件,我希望编辑,都会导致 getTableCellEditor 调用?
  • 是的,每次编辑单元格时都会调用一个编辑器。这有什么问题?同样,它不应该返回一个面板,它应该返回该单元格的数据。如果要编辑“面板”或“表格中的一行数据”中的所有数据,那么是的,您应该创建一个“显示所有数据的弹出对话框”。然后您可以强制所有数据有效在将数据保存回面板或表格之前。
  • 是的,正如我在表格数据中所说,我正在存储原始数据(整数、字符串等)。当调用 getTableCellEditor 时,我使用组件(文本字段和标签)为用户创建一个 JPanel。我了解 JPanel 不会存储它是在每次用户希望编辑单元格时创建或渲染器,并且 JPanel 只是在将“真实数据”存储到表中之前捕获和验证输入的一种方式。
【解决方案2】:
【解决方案3】:

JTable 使用flyweight pattern 渲染和编辑单元格获得了一些效率,如How to Use Tables 中所述。您可以将相同的模式应用于滚动网格。我已经使用了这两种方法,但最近我在JSplitPane 中更喜欢org.netbeans.swing.outline.Outline

【讨论】:

  • 垃圾神,谢谢你的信息。我将对享元模式和 org.netbeans.swing.outline.Outline 进行一些研究,然后回复您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
相关资源
最近更新 更多