JTable: выберите следующую ячейку на вкладке, но первый фокус выбирает ту же ячейку, а не следующую - PullRequest
1 голос
/ 05 октября 2011

Я бы хотел:

  • Есть кнопка добавить строку в JTable
  • Когда эта строка будет создана, поместите ее в фокус и начните редактирование первого столбца
  • Когда пользователь нажимает клавишу Tab, выберите следующий столбец.

Для кнопки Добавить я делаю это:

add_button.addActionListener(new java.awt.event.ActionListener() {
    @Override
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        int row = table_model.addRow();
        table.setRowSelectionInterval(row, row);
        table.scrollRectToVisible(table.getCellRect(row, 0, true));
        table.editCellAt(row, 0);
        table.transferFocus();
        did_add = true;
    }
});

Это действительно заставляет ячейку таблицы сфокусироваться и начать редактирование. Чтобы убедиться, что нажатие Tab выберет следующую ячейку, у меня есть это:

table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0, false), "selectNextColumnCell");

Вот моя проблема:

  • Если я сделал какие-либо ячейки ранее, это работает отлично. Я могу отредактировать первый столбец и нажать клавишу Tab, после чего будет выбран следующий столбец.
  • Однако, если эта таблица была недавно создана или какой-то виджет за пределами этой таблицы ранее имел фокус, и я нажимаю кнопку «Добавить», то это происходит:
    • Первый столбец выбран правильно и доступен для редактирования
    • Когда я нажимаю клавишу Tab, обычно фокусируется одна и та же ячейка
    • Мне нужно нажать Tab еще раз, чтобы перейти к следующему столбцу
    • Иногда эта первая вкладка фактически переходит в ячейку 0,0

Итак, кажется, что, хотя ячейка сфокусирована и редактируется, что-то не так с фокусом таблицы, потому что неправильно указывать, какая ячейка следующая.

Я пробовал несколько обходных путей, связанных с установкой фокуса на таблице, но, похоже, ни один из них не работает (requestFocus, requestFocusInWindow, настройка выбора таблицы и т. Д.).

Есть идеи, как это исправить?

1 Ответ

1 голос
/ 05 октября 2011

Это происходит потому, что выбор столбца не изменен путем установки выбора строки таблицы: при запуске он не выбирается, а затем переход к следующему столбцу (иначе говоря, вывод из редактирования) устанавливает его на первый колонка. Чтобы решить, установите выбор столбца, а также выбор строки

   table.setRowSelectionInterval(row, row);
   table.setColumnSelectionInterval(0, 0);
...