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例外で終わります。問題は、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(..)メソッドを呼び出す必要がありますが、セルの座標を取得する方法がわかりません。
または、入力ベリファイアを作成するためのより簡単な方法はありますか?
よろしくIoannisK。