2013-05-23 1 views
2

У меня есть подходящий в MATLAB, и в настоящее время у меня есть функции обратного вызова для каждой ячейки. Я уже давно пытаюсь установить обратный вызов имени столбца и строки, но без успеха. Более конкретно, если пользователь нажимает на определенное имя столбца, можно ли вызвать функцию?Настраиваемый обратный вызов на имя столбца

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация ... Я был бы признателен за любую помощь. Спасибо заранее!

ответ

0

Это, кажется, невозможно использовать только стандартный интерфейс MATLAB для uitable.

Однако вы можете получить доступ к базовой Java JTable как described on undocumentedmatlab.com. Используя экземпляр JTable, вы должны установить соответствующий обработчик событий, см. this question on SO и this other article on undocumentedmatlab.com.

+0

Hi Florian, Спасибо за быстрый ответ! Я не очень хорошо знаком с Java, я просмотрел ссылки, которые вы разместили, но я все еще немного не уверен, как использовать JTable в MATLAB. Можете ли вы предложить мне ссылку? благодаря – YKa

1

Прежде всего, вам необходимо зарегистрировать обратный вызов для объекта заголовка таблицы. Это объект JTableHeader, и вы можете получить доступ с помощью функции findjobj.

Я создал демоверсию для регистрации функции обратного вызова для события с названием имени столбца. Эта функция обратного вызова используется для изменения имени щелкнутого столбца. Он протестирован на Matlab R2015a.

Для запуска этой демонстрации загрузите файл findjobj и поместите в ту же папку. Затем выполните код ниже.

function TableDemo() 
% Demonstration of clickable columnname. 
% In this example, we use the click event to modify column name. 
figure('menubar','none','numbertitle','off', 'Name', 'DEMO'); 
myTable = uitable('Data', magic(4), 'ColumnName',{'A','B','C','D'}, 'ColumnWidth',{50}); 


% Accessing underlying java object. 
jscrollpane = findjobj(myTable); 
jtable = jscrollpane.getViewport.getView; 
jheader= jtable.getTableHeader(); % Here, you got JTableHeader object. 
h=handle(jheader, 'callbackproperties'); 

% Set a matlab function as MouseClickedCallback 
set(h, 'MouseClickedCallback', {@onHeaderClick, jtable, myTable}); 

end 

function onHeaderClick(src, evt, jtable, hTable) 
if(get(evt, 'ClickCount') > 1) 
    disp('header double clicked'); 

    % Get view index from current mouse point, and convert it to 
    % model index. Then add 1 because Matlab index starts from 1. 
    index = jtable.convertColumnIndexToModel(src.columnAtPoint(evt.getPoint())) + 1; 

    prompt={'Column Name'}; 
    title='Enter column names'; 
    numLines=1; 
    defaultAnswer=hTable.ColumnName(index); 
    options.Resize='on'; 
    options.WindowStyle='modal'; 
    newName=inputdlg(prompt,title,numLines,defaultAnswer,options); 
    if ~isempty(newName) 
     hTable.ColumnName(index) = newName; 
    end 
end 
end