Ячейка таблицы редактируется простым щелчком мыши, я хочу, чтобы она редактировалась только двойным щелчком. Простой щелчок выделит ячейку.
Я использую это свойство uitable
:
set(hTable, 'Data',data,...
'ColumnEditable', edit,...
Ячейка таблицы редактируется простым щелчком мыши, я хочу, чтобы она редактировалась только двойным щелчком. Простой щелчок выделит ячейку.
Я использую это свойство uitable
:
set(hTable, 'Data',data,...
'ColumnEditable', edit,...
Сначала вам нужно установить для редактируемой ячейки значение false по умолчанию:
set(hTable,'ColumnEditable', [false false ...]); %accordingly your number of columns
и введите CellSelectionCallback
:
set(hTable,'CellSelectionCallback',@cellSelect);
который вызывает следующую функцию в том же скрипте
function cellSelect(src,evt)
getstate = get(src,'ColumnEditable'); %gets status of editability
index = evt.Indices; %index of clicked cell
state = [false false ...]; %set all cells to default: not editable
state(index) = ~getstate(index); %except the clicked one, was it
%already false before set it true
set(src,'ColumnEditable', state) %pass property to table
end
а также CellEditCallback
:
set(hTable,'CellEditCallback',@cellEdit);
вызов
function cellEdit(src,~)
state = [false false ...];
set(src,'ColumnEditable', state)
end
минимальный пример
function minimalTable
h = figure('Position',[600 400 402 100],'numbertitle','off','MenuBar','none');
defaultData = {'insert number...' , 'insert number...'};
uitable(h,'Units','normalized','Position',[0 0 1 1],...
'Data', defaultData,...
'ColumnName', [],'RowName',[],...
'ColumnWidth', {200 200},...
'ColumnEditable', [false false],...
'ColumnFormat', {'numeric' , 'numeric'},...
'CellSelectionCallback',@cellSelect);
end
function cellSelect(src,evt)
getstate = get(src,'ColumnEditable');
index = evt.Indices;
state = [false false];
state(index) = ~getstate(index);
set(src,'ColumnEditable', state)
end
function cellEdit(src,~)
state = [false false];
set(src,'ColumnEditable', state)
end
Как вы поняли, это не всегда работает. Потому что у вас те же проблемы, что и у меня раньше, с всплывающими меню. Точно такая же проблема: ColumnEditable
— это просто вектор-строка, а не матрица. Мне пришлось иметь дело со свойством ColumnFormat
, которое также является просто вектором-строкой. Если функция двойного щелчка действительно важна для вас, вы можете ознакомиться со следующими двумя ответами:
Как отменить выбор ячеек в uitable/как отключить подсветку выделения ячеек?
Потоки в основном предлагают создать уникальный uitable
для каждой отдельной строки, чтобы каждая отдельная строка имела уникальное свойство ColumnEditable
. Пока это единственное решение.
Боюсь, простого решения нет. Я не могу предложить вам дополнительную помощь, кроме сложных обходных путей других ответов. Или просто используйте простой способ, описанный выше, и живите с небольшими недостатками.
Хотя эта ветка устарела, но, на мой взгляд, по-прежнему ценна для некоторых пользователей. Я протестировал следующее с R2010b 32bit.
Я добился редактирования только двойным щелчком, просто установив
set(hTable,'CellSelectionCallback',@tableCellSelectCB,'ColumnEditable',true)
и определяя его функцию следующим образом
function tableCellSelectCB(~,~)
try
h.jtable.getCellEditor().stopCellEditing();
catch
end
end
где h.jtable
относится к базовому объекту Java вашего файла uitable.
Таким образом, я могу выбирать даже одну и несколько ячеек, не переходя в режим редактирования. Двойной щелчок по одной ячейке позволяет мне редактировать ее содержимое.
Я хотел иметь флажки в верхней строке и нередактируемые (по крайней мере, напрямую) данные в остальной части таблицы. Вы можете легко изменить приведенное выше:
function tableCellSelectCB(~,evd)
if evd.Indices(1) > 1
try
h.jtable.getCellEditor().stopCellEditing();
catch
end
end
end