Ячейки таблицы будут редактироваться только при двойном щелчке

Ячейка таблицы редактируется простым щелчком мыши, я хочу, чтобы она редактировалась только двойным щелчком. Простой щелчок выделит ячейку.

Я использую это свойство uitable:

set(hTable, 'Data',data,...
    'ColumnEditable', edit,...

person TimeIsNear    schedule 05.11.2013    source источник
comment
Я добавил минимальный пример, с которым вы можете работать. Просто скопируйте его в скрипт функции.   -  person thewaywewalk    schedule 05.11.2013


Ответы (2)


Сначала вам нужно установить для редактируемой ячейки значение 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. Пока это единственное решение.

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

person thewaywewalk    schedule 05.11.2013
comment
Я получаю сообщение об ошибке: Ошибка в ==> cellSelect at 5 state(index) = ~getstate(index); У меня есть 4 столбца В моей таблице я должен написать state = [false false false false]; ? - person TimeIsNear; 05.11.2013
comment
да, вы должны написать это в соответствии с вашим количеством столбцов. - person thewaywewalk; 05.11.2013
comment
Иногда это работает нормально, иногда нет, ячейка редактируется простым щелчком :( - person TimeIsNear; 05.11.2013
comment
не могли бы вы опубликовать свой текущий код, чтобы я мог его посмотреть? И работает ли минимальный пример для вас? - person thewaywewalk; 05.11.2013
comment
единственная ситуация, когда это сработает, будет сразу после выбора. Но тогда вы на самом деле щелкнете по другой ячейке. - person thewaywewalk; 05.11.2013
comment
Он отлично работает с одной строкой, но больше не работает, попробуйте с: defaultData = [{'insert number...', 'insert number...'};{'insert number...', 'insert количество...'}]; - person TimeIsNear; 05.11.2013
comment
да я понял вопрос, пропустил. Прочитайте мой окончательный ответ и ссылки там. Боюсь, я не могу больше помочь вам в этом. - person thewaywewalk; 05.11.2013
comment
Большое спасибо за Вашу помощь! Цель состояла в том, чтобы удалить выбранные строки таблицы, нажав на кнопку удаления. Поэтому я думаю добавить столбец с флажком. Я столкнулся с другими проблемами, я создал новую проблему для этого. - person TimeIsNear; 05.11.2013
comment
Это цель? У меня было бы элегантное решение, без флажка. Вы хотите задать именно это в другом вопросе? Потом выкладываю туда. - person thewaywewalk; 05.11.2013
comment
Меня очень интересует ваше решение, я создал вопрос, не могли бы вы посмотреть? Спасибо. Вопрос: добавьте столбец флажка в таблицу со значением по умолчанию false - person TimeIsNear; 05.11.2013
comment
но это вопрос с флажком. Измените его на что-то вроде Как удалить выбранную строку в uitable? - person thewaywewalk; 05.11.2013

Хотя эта ветка устарела, но, на мой взгляд, по-прежнему ценна для некоторых пользователей. Я протестировал следующее с 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
person Martin Lehmann    schedule 11.11.2015