代码之家  ›  专栏  ›  技术社区  ›  Fuzzy76

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

  •  0
  • Fuzzy76  · 技术社区  · 17 年前

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

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

    4 回复  |  直到 16 年前
        1
  •  0
  •   carson    17 年前

    因为您必须测试点击,所以不能使用模型的方法来进行测试,所以您应该尝试重写jtable public void changeSelection(int rowIndex, int columnIndex, boolean toggle, oolean extend) 方法。如果该行被锁定,则不要调用super.changeselection,它应使该行保持未选中状态。

        2
  •  2
  •   Rastislav Komara    17 年前

    在编辑/设置值之前,通过table model.is cell editable(row,col)询问表模型是否可编辑。在这里你可以实现你的锁。在tableModel.setValue(row,col,val)之后,您应该解除锁定。但是。锁定操作需要花费大量时间,并使您的用户界面不负责任。而且很糟糕。尝试不同的方法。懒惰的失败怎么办?锁定行,检查数据的有效性,如果数据更新则失败。如果数据正常,就把它们放下。解锁。

        3
  •  1
  •   Nick Pierpoint    17 年前

    Oracle有一个很好的方法来处理这个问题,但我不知道它有多普遍适用。

    在Oracle中,您可以使用 用于更新 在select语句中锁定您读取的记录。

    例如,如果要获取要显示的行:

    select * into v_row from my_table where my_table_id = 1
    for update;
    

    这将允许读取但阻止更新。如果另一个事务有一个锁,那么您的事务将一直等到它变为可用(或最终超时)。如果希望语句在尝试锁定时引发异常,则添加 诺瓦伊特 .

    select * into v_row from my_table where my_table_id = 1
    for update nowait;
    

    如果该行已被锁定,您将得到:

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

    希望有帮助。

        4
  •  0
  •   John Gardner    17 年前

    相反,您可以等到用户实际更改了某个内容,然后重写jtable.editingstop在那里完成工作(甚至可以检查值是否更改)。

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