gpt4 book ai didi

swing - JTable 输入验证器

转载 作者:行者123 更新时间:2023-12-04 13:21:01 25 4
gpt4 key购买 nike

我正在尝试为 JTable 创建一个简单的输入验证器。
我最终覆盖了方法:editingStopped()。
问题是该事件不包括有关已更新单元格的信息。

这是我的“伪代码”:

  If (user finished editing a cell)  {
Check if cell`s value is "1" or "0" or "-" (Karnaugh-Veitch)
If (check = false)
setValue (cell, "");
}

我尝试的第一个是这里:
table.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
inputVerify (e.getColumn(), e.getFirstRow());
}
});

public void inputVerify (int column, int row) {
boolean verified = true;
String field = table.getValueAt(row, column).toString();

if (field != null && field.length() == 1) {
if ( !(field.charAt(0) == '0' || field.charAt(0) == '1' || field.charAt(0) == '-' ))
verified = false;
}
else {
verified = false;
}

if (!verified) {
table.getModel().setValueAt("", row, column);
java.awt.Toolkit.getDefaultToolkit().beep();
}

System.out.println ("Column = " + column + " Row = " + row + " Value = " + table.getValueAt(row, column) +" Verified = "+verified);
}

但这最终会导致:StackOverflow Exception。我猜问题是: setValueAt(..) 触发另一个 tableChanged() 事件并且正在生成一个无限循环。

现在,我在这里尝试了这个:
    table.getDefaultEditor(Object.class).addCellEditorListener(new CellEditorListener() {

// called when editing stops
public void editingStopped(ChangeEvent e) {

// print out the value in the TableCellEditor
System.out.println(((CellEditor) e.getSource()).getCellEditorValue().toString());

}

public void editingCanceled(ChangeEvent e) {
// whatever
}
});

但正如您所看到的,我只能检索单元格的新值,而不是“坐标”。
我需要调用:setValueAt(..) 方法,但我不知道如何获取单元格的坐标。

还是有更简单的方法来创建输入验证器?

最好的祝福
约安尼斯·K。

最佳答案

第一:对 JTable 编辑的输入验证没有得到很好的支持。一些评论

  • TableModelListener 中的 tableChanged 不是进行验证的好地方,此时更改已经发生(模型通知其监听器这一事实)
  • 因此,无论您选择何种验证(验证)方法 Hook ,永远不会与模型对话,您最终会陷入无限循环(如您所见)
  • 应用程序提供的 CellEditorListener 相当无用,因为 a) 不能保证通知的顺序(JTable 可能已经更新了模型,也可能没有) b) 编辑器的生命周期定义不明确

  • 毕竟那些(不完整,不幸的是;-)没有,有点希望:最好的办法是实现一个自定义 CellEditor,它在 stopCellCellEditing 中进行验证:如果新值无效,则返回 false 并可选地提供视觉错误回馈。查看 JTable.GenericEditor 以了解如何完成

    关于swing - JTable 输入验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5873033/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com