Matlab에서 기본 지원이 없습니다. 가장 쉬운 해결책은 "약간의 해킹"이있는 uitable
을 사용하는 것입니다.
아래에 표시된 솔루션은 표의 단일 셀 또는 여러 셀을 선택하는 데 적합합니다. 경계가 유지되고, 즉 값이 "랩 어라운드 (wrap around)"되지 않습니다.
function reorderableTable
h(1) = figure(1); clf
filenames = {...
'file1.txt.'
'file2.txt.'
'file3.txt.'
'file4.txt.'
'file5.txt.'
};
h(2) = uitable(h(1),...
'data' , filenames, ...
'units' , 'normalized',...
'position', [0.1 0.1 0.5 0.85],...
'CellSelectionCallback', @selectCells);
h(3) = uicontrol(...
'style' , 'pushbutton', ...
'units' , 'normalized',...
'position', [0.7 0.58 0.2 0.15],...
'string' , 'Up',...
'callback', @reOrder);
h(4) = uicontrol(...
'style' , 'pushbutton', ...
'units' , 'normalized',...
'position', [0.7 0.38 0.2 0.15],...
'string' , 'Down',...
'callback', @reOrder);
set(h(3:4), 'enable', 'off');
function selectCells(src, evt)
set(src, 'UserData', evt.Indices);
if ~isempty(evt.Indices)
set(h(3:4), 'enable', 'on');
else
set(h(3:4), 'enable', 'off');
end
end
function reOrder(src,~)
up = strcmpi(get(src, 'string'), 'up');
table = h(2);
data = get(table, 'Data');
selected = get(table, 'UserData');
selected = selected(:,1);
if up
sel = selected-1;
not_selected = setdiff(sel, selected);
nsel = setdiff(selected, sel);
if sel(1)>=1 && nsel(end)<=size(data,1)
new_data = data;
new_data(sel ,:) = data(selected,:);
new_data(nsel,:) = data(not_selected,:);
else
return
end
else
sel = selected+1;
not_selected = setdiff(sel, selected);
nsel = setdiff(selected, sel);
if sel(1)<=size(data,1) && nsel(end)>=1
new_data = data;
new_data(sel ,:) = data(selected,:);
new_data(nsel,:) = data(not_selected,:);
else
return
end
end
set(table, 'Data', new_data);
end
end
영감 (부분적으로) here에서왔다.
중첩 된 함수가 마음에 들지 않는다면 하위 함수로 다시 정의하는 것이 쉽지만 핸들을 전달해야합니다 (따라서 중첩 된 함수를 처음 사용하는 이유입니다).
드래그 - 앤 - 낙하 : 그것은 는 만 uitable
열 (this link 참조)에, 기본적으로 수행 할 수 있습니다. 이것은 내가 생각하기에 끔찍한 것 같지만 하나 또는 두 개의 파일 만 있으면 작동 할 수 있습니다.
그렇지 않으면 : 당신은 위의 그림과 같이 버튼을 사용하거나 (jTable
이외의) 다른 자바 객체가있는 경우 하지이 당신에 대해 행을 드래그 할 수 있는지 조금 주위에 구글 수 있습니다. 저는 Java에 익숙하지 않으므로 다른 곳을 봐야 할 것입니다.