我有一个JTable,其中包含用户可以编辑的数据。我想确保当用户编辑“name”列时,新值在表中是唯一的,即没有其他具有相同名称的条目。我尝试使用自定义单元格编辑器和输入验证程序,如下所示:
class CellEditor extends DefaultCellEditor {
InputVerifier verifier = null;
public CellEditor(InputVerifier verifier) {
super(new JTextField());
this.verifier = verifier;
}
@Override
public boolean stopCellEditing() {
return verifier.verify(editorComponent) && super.stopCellEditing();
}
}
class MyVerifier extends InputVerifier {
DefaultTableModel tm = null;
MyVerifier(DefaultTableModel tm) {
super();
this.tm = tm;
}
@Override
public boolean verify(JComponent input) {
boolean verified = true;
String text = ((JTextField) input).getText();
for (int i = 0; i < tm.getRowCount(); i++) {
String s = (String) tm.getValueAt(i, 1);
if (s.equals(text)) {
verified = false;
break;
}
}
return verified;
}
}
在我的代码中,我使用以下方法将单元格编辑器设置为特定列:
tm = (DefaultTableModel) myTable.getModel();
myTable.getColumnModel().getColumn(1).setCellEditor(new CellEditor(new MyVerifier(tm)));
问题是,当我遍历列而不改变任何内容时,我总是得到重复的值,因为verify方法中的循环检查所有行,包括焦点行本身。我想排除这种情况,但我无法访问焦点条目的行号。还有其他解决方案吗?感谢。