Cug*_*uga 11 java validation swing jtable tablecelleditor
如果我采用a JTable并在其模型上指定列的classtype,如下所示:
DefaultTableModel model = new DefaultTableModel(columnNames, 100) {
@Override
public Class<?> getColumnClass(int columnIndex) {
return Integer.class;
}};
Run Code Online (Sandbox Code Playgroud)
然后,只要用户尝试double在表中输入值,Swing就会自动拒绝输入并将单元格的轮廓设置为红色.
当某人输入单元格的"负数或0"输入时,我希望发生相同的效果.我有这个:
@Override
public void setValueAt(Object val, int rowIndex, int columnIndex) {
if (val instanceof Number && ((Number) val).doubleValue() > 0) {
super.setValueAt(val, rowIndex, columnIndex);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这可以防止单元格接受任何非正值,但不会将颜色设置为红色并使单元格保持可编辑状态.
我试着调查JTable默认情况下是如何做出拒绝的,但我似乎无法找到它.
如何拒绝非正输入与拒绝非整数输入相同?
谢谢
tra*_*god 15
该private static class JTable.GenericEditor用内省赶上通过构建特定引发的异常Number的子类无效String值.如果您不需要这样的通用行为,请考虑将其创建PositiveIntegerCellEditor为子类DefaultCellEditor.你的stopCellEditing()方法会相应简单.
附录:已更新以使用RIGHT对齐和常见错误代码.
附录:另请参阅使用编辑器验证用户输入的文本.

private static class PositiveIntegerCellEditor extends DefaultCellEditor {
private static final Border red = new LineBorder(Color.red);
private static final Border black = new LineBorder(Color.black);
private JTextField textField;
public PositiveIntegerCellEditor(JTextField textField) {
super(textField);
this.textField = textField;
this.textField.setHorizontalAlignment(JTextField.RIGHT);
}
@Override
public boolean stopCellEditing() {
try {
int v = Integer.valueOf(textField.getText());
if (v < 0) {
throw new NumberFormatException();
}
} catch (NumberFormatException e) {
textField.setBorder(red);
return false;
}
return super.stopCellEditing();
}
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
textField.setBorder(black);
return super.getTableCellEditorComponent(
table, value, isSelected, row, column);
}
}
Run Code Online (Sandbox Code Playgroud)