Создание редактируемой ячейки JTable, но *нет* двойным щелчком мыши
-
13-09-2019 - |
Вопрос
Я пытаюсь добавить столбец в JTable
со следующим поведением (аналогично Windows Explorer и аналогичным оболочкам):
- Ячейку можно щелкнуть один раз, чтобы выделить ее, как обычно.
- Дважды щелкнув по ячейке, можно выполнить отдельное действие (запуск внешней программы).
- Значение ячейки (строку) по-прежнему можно редактировать, дважды щелкнув один раз (после паузы) или нажав Ф2 когда ячейка выделена.
Двойной щелчок должен нет запускать редактирование ячейки, но я хотел бы, если возможно, оставить в рабочем состоянии любые другие триггеры редактирования по умолчанию.
Я попробовал добавить MouseListener
к столу и съедаю все MouseEvent
s, но это не работает - если я вернусь true
от isCellEditable()
тогда мой слушатель никогда не получит никаких событий кликов, но если я вернусь false
затем Ф2 больше не работает.
Можно ли этого добиться, используя только прослушиватели событий?Я бы предпочел не связываться с функциями PLAF, если можно этого избежать.
Решение
Вам придется создать свой собственный редактор ячеек и переопределить
public boolean isCellEditable( EventObject e )
Вы можете различать одиночный и двойной щелчок с помощью параметра clickCount на eventObject.
Если это один щелчок и он находится в выбранной ячейке, вы можете вернуть true, в противном случае верните false;
получить строку и столбец с помощью
int row = ( (JTable) e.getSource() ).rowAtPoint(e.getPoint());
int column = ( (JTable) e.getSource() ).columnAtPoint(e.getPoint());
чтобы включить F2, вы можете добавить собственные записи inputMap и actionMap
similar too
table.getInputMap().put(KeyStroke.getKeyStroke("DOWN"), "doMyArrowDown");
table.getTable().getActionMap().put("doMyArrowDown", new ArrowDownAction());
и от вашего действия вы можете затем запустить камеру, редактируя себя
table.editCellAt(row, column );
Другие советы
DefaultCellEditor имеет метод setClickCountToStart() для управления щелчками мыши при редактировании.Значение по умолчанию — 2.Изменение этого параметра не повлияет на функциональность F2.
Поэтому вы можете настроить редактирование тройным щелчком мыши.
Не знаю точно, как обрабатывать два одиночных щелчка, чтобы начать редактирование, но я думаю, вам следует использовать таймер, чтобы отслеживать первый щелчок, а затем выполнять редактирование, если второй одиночный щелчок находится в пределах вашего интервала времени.
Я решил это, обернув существующий CellEditor
с Proxy
и перехват звонков на isCellEditable
, возвращая false для всех событий мыши и делегируя все остальные вызовы исходному CellEditor
.
Это немного сложнее, чем решение camickr, но работает для всех редакторов (всего у меня их 4).