JTable 输入验证器
我正在尝试为 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(..)方法,但我不知道如何获取单元格的坐标。
或者有没有更简单的方法来创建输入验证器?
此致 扬尼斯·K.
I am trying to create a simple Input Verifier for a JTable.
I ended up with overriding the method: editingStopped().
The problem is that the event does not include informations about the cell that has been updated.
This is my "pseudo code":
If (user finished editing a cell) {
Check if cell`s value is "1" or "0" or "-" (Karnaugh-Veitch)
If (check = false)
setValue (cell, "");
}
The first I tried was this here:
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);
}
But this ends up with an : StackOverflow Exception. I guess the problem is that: setValueAt(..) fires another tableChanged() event and an endless loop is being generated.
Now, I tried this here:
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
}
});
But as you can see I can just retrieve the new value of the cell, not the "coordinates".
I need to call: setValueAt( .. ) method, but I dont know how to get the cell`s coordinates.
Or is there a more simple way to create an input verifier??
Best regards
Ioannis K.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
第一:JTable 编辑的输入验证没有得到很好的支持。 TableModelListener 中的几条注释
毕竟这些(不幸的是,不完整;-)不行,有一点希望:最好的选择是实现一个自定义的 CellEditor,它在 stopCellCellEditing 中进行验证:如果新值无效,返回 false 并可选择提供可视错误反馈。查看 JTable.GenericEditor 以了解如何完成此操作
First: input validation on JTable editing is not well supported. A couple of comments
After all those (incomplete, unfortunately ;-) no-nos, a little hope: best bet is to implement a custom CellEditor which does the validation in stopCellCellEditing: if the new value isn't valid, return false and optionally provide a visual error feedback. Have a look at JTable.GenericEditor to get an idea of how that might be done
什么对我有用(向克利奥帕特拉脱帽致敬):
What worked for me (tip 'o the hat to kleopatra):
我同意将验证器保留在 JTextField 上下文之外(验证器可以从非表编辑的其他条目字段中重用)。如果您只想在继续编辑时显示错误消息,可以轻松地将验证代码附加到 TableCellEditor 上的 getCellEditorValue() 方法。您可以将掩码附加到文本字段,您可以通过传递格式化程序来格式化此处的条目......根据您的要求;最小代码如下:
I agree with keeping the verifier out of JTextField context (verifier could be reused from other Entry fields that are not table edits). If you just want to display an error message while continuing editing, verification code could be easily attached to getCellEditorValue() method on TableCellEditor. You may attach a mask to the text field, you may format entry here by passing formatters...up to your reqs; minimal code bellow: