如果我使用JTable并在其模型上指定列的classtype,如下所示:
DefaultTableModel model = new DefaultTableModel(columnNames,100) { @Override public Class<?> getColumnClass(int columnIndex) { return Integer.class; }};
然后,每当用户尝试在表中输入双重值时,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); } } }
这样可防止单元格接受任何非正值,但不会将颜色设置为红色,并将单元格保留为可编辑.
我试着看看JTable在默认情况下如何做拒绝,但我似乎找不到.
如何拒绝非正输入与拒绝非整数输入相同的方式?
谢谢
解决方法
private static class JTable.GenericEditor
使用内省来捕获通过使用无效的String值构造特定Number子类引发的异常.如果您不需要这样的通用行为,请考虑将ActiveIntegerCellEditor创建为
DefaultCellEditor
的子类.您的stopCellEditing()方法将相应更简单.
附录:另见Using an Editor to Validate User-Entered Text.
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); } }