MATLAB uitable генерация строк из пользовательского ввода

У меня есть графический интерфейс в MATLAB, который использует uitables для ввода. Есть столбцы с фиксированным числом, и каждый столбец имеет очень специфический формат, который я сохранил в виде массива ячеек, например:

columnformat = {'text', 'numeric', {@doSomething, inputArg1}, {'Option1' 'Option2'}};

Количество рядов теоретически не ограничено; пользователь может предоставить столько, сколько захочет. Серверная часть способна обрабатывать произвольное количество входных строк. Прямо сейчас я сначала создаю большой uitable и просто предполагаю, что пользователь не будет использовать его все.

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

Я пробовал много разных подходов, включая динамическую настройку «Данные», и все они, похоже, нарушают пользовательское форматирование, продиктованное массивом ячеек. Я уверен, что кто-то делал это раньше. Спасибо за вашу помощь!


person Justin Fletcher    schedule 26.04.2014    source источник
comment
Хотели бы вы работать с uitable, сделанным с использованием MATLAB GUIDE?   -  person Divakar    schedule 26.04.2014
comment
Ага. Есть ли разница? Я спрашиваю, потому что я использовал оба, и созданный GUIDE кажется менее стабильным, более склонным к странному поведению.   -  person Justin Fletcher    schedule 26.04.2014
comment
Не могли бы вы подробнее объяснить странное поведение? У меня есть что добавить, если вы используете MATLAB GUIDE.   -  person Divakar    schedule 26.04.2014
comment
Я использую GUIDE, и особенно странное поведение заключается в том, что когда я извлекаю данные, добавляю строку и переназначаю, формат столбца не назначается новой строке данных.   -  person Justin Fletcher    schedule 26.04.2014
comment
Просто любопытно, сработал ли мой ответ здесь для вас? Я действительно задавался этим вопросом.   -  person Divakar    schedule 30.04.2014


Ответы (2)


Я не мог придумать возможности добиться того, что вы хотите, с определенным ключом, я думаю, что это было бы возможно с любым ключом (KeyPressFcn). Но я бы рекомендовал ввести панель инструментов с кнопкой:

h = figure(...
u = uitable(h, ...
set(u,'Tag','myTable')
tbar = uitoolbar(h);
uipushtool(tbar,'ClickedCallback',@addRow);

В вашей функции обратного вызова вам нужно получить свои данные, добавить строку и записать ее обратно:

function addRow(~,~)

u = findobj(0,'Type','uitable','Tag','myTable');
data = get(u,'Data');
%// modify your data, add a row ...
set(src,'Data',data);

end

Извините, если все немного просто и непроверенно, но хороший ответ потребует значительных усилий, на которые у меня нет времени. Тег matlab-uitable может дать вам много дальнейших идей.

person thewaywewalk    schedule 26.04.2014
comment
В этом случае решение с панелью инструментов немного неэлегантно из-за контекста графического интерфейса. Тем не менее, вы вдохновили на ответ, поэтому я даю вам принятый ответ. - person Justin Fletcher; 26.04.2014
comment
Я собираюсь спросить гораздо более конкретное продолжение о функциональности ввода для добавления строки. Спасибо! - person Justin Fletcher; 26.04.2014

Это решение работает с графическим интерфейсом, созданным с использованием MATLAB GUIDE. Я думаю, что это правда, что MATLAB GUI показывает странное поведение, но я видел большую часть странного поведения при отладке обратных вызовов MATLAB с использованием чего-то вроде keyboard и неправильного выхода из них с помощью dbquit. Поэтому я бы посоветовал держаться подальше от использования команд, связанных с клавиатурой, для графических интерфейсов MATLAB, созданных с помощью GUIDE.

Теперь, вернемся к решению вашей проблемы, выполните следующие действия.

Шаг 1. Добавьте это в начало GUINAME__OpeningFcn:

handles.row_col_prev = [1 1];

Шаг 2. Щелкните свойства таблицы в контексте и нажмите CellSelectionCallback. Таким образом, если тег таблицы uitable1, будет создана функция с именем - uitable1_CellSelectionCallback.

Предполагая, что рисунок графического интерфейса имеет тег - addrows_figure

Добавьте в него:

%%// Detect the current key pressed
currentkey = get(handles.addrows_figure,'CurrentCharacter')

%%// Read in previous row-col combination
prev1 = handles.row_col_prev

%%// Read in current data. We need just the size of it though.
data1 = get(handles.uitable1,'Data');

%%// Main processing where a row is appended if return is pressed
if numel(prev1)~=0
    if size(data1,1)==prev1(1) & currentkey==13 %%// currentkey==13 denotes carriage return in ascii
        data1(end+1,:) = repmat({''},1,size(data1,2)); %%// Append empty row at the end 
        set(handles.uitable1,'Data',data1); %%// Save it back to GUI
    end
end

%%// Save the current row-col combination for comparison in the next stage
%%// when selected cell changes because of pressing return
handles.row_col_prev = eventdata.Indices;
guidata(hObject, handles);

Надеюсь, это сработает для вас!

person Divakar    schedule 26.04.2014