如何将JTable单元格输入标记为无效?

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)