Java 如何在允许编辑JTable中的给定行之前进行检查

Java 如何在允许编辑JTable中的给定行之前进行检查,java,swing,jtable,Java,Swing,Jtable,这个问题很基本。我有一个JTable,显示数据库中的缓存数据。如果用户单击单元格进行编辑,我想尝试锁定数据库中的该行。如果锁定不成功,我希望阻止编辑 但我似乎找不到任何干净的方法来实现这一点。我遗漏了什么吗?因为您必须在单击时进行测试,所以您不能使用模型的方法来进行测试,因此您应该尝试覆盖JTable的方法。如果该行被锁定,则不要调用super.changeSelection,它应该保持该行未选中。因为您必须在单击时进行测试,所以您不能使用模型的方法来执行此操作,因此您应该尝试覆盖JTable的

这个问题很基本。我有一个JTable,显示数据库中的缓存数据。如果用户单击单元格进行编辑,我想尝试锁定数据库中的该行。如果锁定不成功,我希望阻止编辑


但我似乎找不到任何干净的方法来实现这一点。我遗漏了什么吗?

因为您必须在单击时进行测试,所以您不能使用模型的方法来进行测试,因此您应该尝试覆盖JTable的方法。如果该行被锁定,则不要调用super.changeSelection,它应该保持该行未选中。

因为您必须在单击时进行测试,所以您不能使用模型的方法来执行此操作,因此您应该尝试覆盖JTable的方法。如果该行被锁定,则不要调用super.changeSelection,它应该使该行保持未选中状态。

Oracle有一种很好的处理方法,但我不知道它是否普遍适用

在Oracle中,您可以对SELECT语句使用FOR UPDATE,在读取记录时锁定该记录

例如,如果要提取行以进行显示:

select * into v_row from my_table where my_table_id = 1
for update;
这将允许读取,但阻止更新。如果另一个事务具有锁,则您的事务将等待它变为可用(或最终超时)。如果要在尝试锁定时让语句引发异常,请添加NOWAIT

select * into v_row from my_table where my_table_id = 1
for update nowait;
如果该行已锁定,您将获得:

ORA-00054: resource busy and acquire with NOWAIT specified.

希望这能有所帮助。

Oracle有一个很好的处理方法,但我不知道它是否普遍适用

在Oracle中,您可以对SELECT语句使用FOR UPDATE,在读取记录时锁定该记录

例如,如果要提取行以进行显示:

select * into v_row from my_table where my_table_id = 1
for update;
这将允许读取,但阻止更新。如果另一个事务具有锁,则您的事务将等待它变为可用(或最终超时)。如果要在尝试锁定时让语句引发异常,请添加NOWAIT

select * into v_row from my_table where my_table_id = 1
for update nowait;
如果该行已锁定,您将获得:

ORA-00054: resource busy and acquire with NOWAIT specified.

希望对您有所帮助。

在编辑/设置值之前,通过TableModel.isCellEditable(行、列)询问表格模型此单元格是否可编辑。在这里你可以实现你的锁。在TableModel.setValue(行、列、值)之后,您应该解除锁定。但是锁定操作会花费很多时间,并使UI不负责任。这很糟糕。尝试不同的方法。那么懒惰失败呢?锁定行,检查数据的有效性,如果数据较新,则失败。如果数据没有问题,你就把它们记下来。解锁。

编辑/设置值之前,通过TableModel.isCellEditable(行、列)询问表格模型此单元格是否可编辑。在这里你可以实现你的锁。在TableModel.setValue(行、列、值)之后,您应该解除锁定。但是锁定操作会花费很多时间,并使UI不负责任。这很糟糕。尝试不同的方法。那么懒惰失败呢?锁定行,检查数据的有效性,如果数据较新,则失败。如果数据没有问题,你就把它们记下来。解锁。

相反,您可以等待用户实际更改某些内容,然后覆盖JTable.editingStopped在那里执行工作(您甚至可以检查值是否更改)


这样,在用户实际更改某些内容之前不会执行锁定。

相反,您可以等待用户实际更改某些内容,然后覆盖JTable.editingStopped在那里执行工作(您甚至可以检查值是否更改)


这样,在用户实际更改某些内容之前不会执行锁定。

实际上,我仍然希望行是可选的(因为我有一个导出选定行的功能,不需要锁定),但您的回答给了我正确的想法。:)我将替代JTable上的editCellAt(),否则将按照您的建议执行。单元格选择和可编辑性不相关。在前面提到的isTableCellEditable方法中,您可以返回false,JTable将不会开始编辑。但在编辑之前保持一行的锁定也不是一个好主意。实际上,我仍然希望行是可选的(因为我有一个导出选定行的功能,不需要锁定),但您的回答给了我正确的想法。:)我将替代JTable上的editCellAt(),否则将按照您的建议执行。单元格选择和可编辑性不相关。在前面提到的isTableCellEditable方法中,您可以返回false,JTable将不会开始编辑。但是在编辑之前保持一行的锁定也是一个不好的选择