2016-10-26 5 views
1

Я работаю в GUI в приложении MATLAB. Я использую uitable объект. Тогда я нахожу интересным undocumented feature, как сортировать свои данные, выбрать всю строку и т.д.Функциональный дескриптор с использованием функции `set` MATLAB

Я делаю это так:

% create jhandle to my uitable object 
juiTable = findjobj(handles.uitable1,'class','UIScrollPane'); 
jtable = juiTable(1).getComponent(0).getComponent(0); 
%... some my action like this: 
jtable.setRowSelectionAllowed(true); 
%... 

%and now lets try use callback for selected cell in uitable: 
juiFunHandle = handle(jtable, 'CallbackProperties'); 

set(juiFunHandle, 'MousePressedCallback', @CellSelectionCallback); 
set(juiFunHandle, 'KeyPressedCallback', @CellSelectionCallback); 

Это прекрасно работает.

Теперь вопрос: как поставить несколько параметров на CellSelectionCallback? Я хочу, чтобы эта функция сделала какое-то действие (активирует некоторые кнопки и т. Д.). Для этого я пытаюсь установить GUI handles. Но как?

Моя CellSelectionCallback функция:

function CellSelectionCallback(juiTable, varargin) 
% get it from the example 
row = get(juiTable,'SelectedRow')+1; 
fprintf('row #%d selected\n', row); 

P.S. Я вижу varargin. Могу ли я использовать несколько аргументов? Как установить его с помощью моей функции set?

ответ

1

По умолчанию обратные вызовы MATLAB передают два входных аргумента (объект, сгенерированный обратный вызов и некоторые данные о событиях). Если вы хотите передать больше (или меньше) аргументов для вашего обратного вызова, вы можете использовать анонимную функцию для приема этих двух входов, а затем вызвать обратный вызов с нужными входами.

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

set(juiFunHandle, 'MousePressedCallback', ... 
    @(src, evnt)CellSelectionCallback(src, evnt, handles)); 

Тогда ваш обратный вызов будет выглядеть примерно так:

function CellSelectionCallback(jtable, evntdata, handles) 
+0

Ах, конечно! Просто используйте его как обычную анонимную функцию! Кстати, я могу использовать 'function CellSelectionCallback (juiTable, varargin)', а затем 'varargin {2}'. –

+0

@Mikhail_Sam Конечно, вы тоже можете это сделать, я просто предпочитаю явные входы вместо 'varargin', поэтому я показал это как альтернативный подход. – Suever

Смежные вопросы