Как вернуться к отредактированной ячейке в JTable после нажатия клавиши TAB? - PullRequest
0 голосов
/ 21 февраля 2012

Сценарий такой: пользователь редактирует ячейку и нажимает клавишу TAB.Редактирование остановлено, и значение находится в модели.Однако, если postUpdateTestFailed() возвращает true, я хочу переместить выделение обратно в только что отредактированную ячейку, чтобы пользователь мог внести некоторые изменения.Проблема в том, что это не работает.В моем случае это работает для всего, кроме выбранной ячейки ... :( Поскольку пользователь нажимает клавишу TAB, выделенная / выделенная ячейка всегда следующая. Кажется, что изменение моего выбора игнорируется в данном конкретном случае. Что я делаю неправильно?:)

public void tableChanged(TableModelEvent tme) {
    int row = tme.getFirstRow();
    int col = tme.getColumn();
    int type = tme.getType();
    switch (type) {
        case TableModelEvent.UPDATE:
            currentRow = areenTable.convertRowIndexToView(row);
            currentColumn = areenTable.convertColumnIndexToView(col);
            if (postUpdateTestFailed()) {
                // if the test fails, I want to move back to the edited cell
                areenTable.changeSelection(currentRow, currentColumn, false, false);
            }
            break;

        // the rest of switch

    } // switch
} // tableChanged() method

Редактировать 1 : Я надеялся, что кто-то уже сталкивался с такой же проблемой и как-то решил ее ...

Редактировать 2 : Обычно я делаю это в собственной реализации редактора ячеек и предотвращаю фиксацию, если проверка не удаласьК сожалению, в этом особом случае мне нужно позвонить postUpdateTestFailed() после , когда изменение зафиксировано ... И затем установить курсор на ранее отредактированную ячейку.Странно то, что я могу переместиться в любую другую клетку , но последнюю отредактированную !!Я считаю это ошибкой.

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

не удержался, чтобы попробовать это (звучало достаточно странно - и да, даже мне пришлось попробовать это и увидеть , что происходит, так что в следующий раз ...; -)

Проблема в том, что ваш слушатель уведомлен до таблицы, то есть внутренние обновления еще не готовы. Чтобы работать, убедитесь, что он обрабатывается после внутренних элементов таблицы, оборачиваясь в invokeLater, что-то вроде

    @Override
    public void tableChanged(TableModelEvent tme) {
        int row = tme.getFirstRow();
        int col = tme.getColumn();
        int type = tme.getType();
        switch (type) {
            case TableModelEvent.UPDATE:
                final int currentRow = table.convertRowIndexToView(row);
                final int currentColumn = table.convertColumnIndexToView(col);
                if (currentRow == 0) {
                    // if the test fails, I want to move back to the edited cell
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            table.changeSelection(currentRow, currentColumn, false, false);

                        }
                    });
                }
                break;

            // the rest of switch

        } // switch
    } // tableChanged() method

Кстати, я бы не стал прислушиваться к изменениям в TableModel (они могут происходить программно или по другим причинам, например, изменениям в базовой модели данных), вместо этого прислушивался к изменениям в редакторе таблицы или свойстве editRow / Column

2 голосов
/ 21 февраля 2012

Показанный подход проверяет данные после редактирования, которое требует возврата к последней отредактированной ячейке.Вместо этого проверьте введенное значение в пользовательском TableCellEditor до , которое будет завершено, как показано в этом примере .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...