Создание редактируемой ячейки JTable, но *нет* двойным щелчком мыши

StackOverflow https://stackoverflow.com/questions/1268201

Вопрос

Я пытаюсь добавить столбец в JTable со следующим поведением (аналогично Windows Explorer и аналогичным оболочкам):

  • Ячейку можно щелкнуть один раз, чтобы выделить ее, как обычно.
  • Дважды щелкнув по ячейке, можно выполнить отдельное действие (запуск внешней программы).
  • Значение ячейки (строку) по-прежнему можно редактировать, дважды щелкнув один раз (после паузы) или нажав Ф2 когда ячейка выделена.

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

Я попробовал добавить MouseListener к столу и съедаю все MouseEvents, но это не работает - если я вернусь 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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top