我对这两者之间的区别有一些想法。但是,我对何时使用时有些困惑。我只知道,
- 要显示 JTable,请创建一个 JTable 并为其设置相应的表模型。
- 任何时候,如果我们想更改该表中的数据,更改模型中的数据,那么更改将反映在视图中。
我们可以从视图和模型中获取表的值。这是我感到困惑的地方。如果发生任何像(行选择)这样的事件,那么我必须从中获取值?是从视图还是模型?考虑到 JTable 的排序和过滤,最佳实践是什么?
我对这两者之间的区别有一些想法。但是,我对何时使用时有些困惑。我只知道,
我们可以从视图和模型中获取表的值。这是我感到困惑的地方。如果发生任何像(行选择)这样的事件,那么我必须从中获取值?是从视图还是模型?考虑到 JTable 的排序和过滤,最佳实践是什么?
您可以从表的模型或JTable
实例本身中获取值;最终结果是一样的。JTablegetValueAt
和相关的方法都只是简单地在内部表模型对象上调用相同的方法。
JTable#getValueAt(int, int) 源代码:
public Object getValueAt(int row, int column) {
return getModel().getValueAt(convertRowIndexToModel(row),
convertColumnIndexToModel(column));
}
我的经验法则是从发生更改的元素(通常是事件源)中检索数据。在您的行选择更改示例的情况下,我从表中检索数据,因为选择与视图相关。
这是为了避免我没有使用正确的行/列。在行选择的示例中,数据完全有可能在视图端(在 中JTable
)排序,而模型端没有改变(在 中TableModel
)。JTable
在这种情况下,如果我收到选择第 5 行的事件,则表示第 5 行在TableModel
.
这可以在getValueAt
@Vulcan 的答案中发布的实现中看到。它询问模型的值,但首先将行和列索引从“视图坐标”转换为“模型坐标”。