хм, могло бы быть более простое решение этого. Пожалуйста, попробуйте это, у меня получилось. Ключ заключается в том, чтобы запомнить последний выбранный элемент, а затем выполнить проверку текущего элемента. Если ввод неправильный, вы можете вернуться к последнему выбранному элементу и уведомить об этом пользователя. Откат выполняется с помощью EventQueue.invokeLater (...), поэтому избегая рекурсивного вызова слушателей.

аюсь создать простой Input Verifier для JTable. Я закончил с переопределением метода: editStopped (). Проблема состоит в том, что событие не включает в себя информацию о ячейке, которая была обновлена.

Это мой "псевдокод":

  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 (..) метод, но я не знаю, как получить координаты ячейки.

Или есть более простой способ создать входной верификатор ??

С наилучшими пожеланиями Иоаннис К.

Ответы на вопрос(3)

Ваш ответ на вопрос