Matlab では、これに対するネイティブ サポートはありません。最も簡単な解決策はuitable
、「いくつかのハック」を使用することです。
以下に示すソリューションは、テーブル内の単一のセルまたは複数のセルを選択する場合に機能します。境界は維持されます。つまり、値は「ラップアラウンド」しません。
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
インスピレーション(部分的)はここから来ました。
ネストされた関数が気に入らない場合は、それらをサブ関数として簡単に再定義できますが、ハンドルを渡す必要があります (これが、最初にネストされた関数を使用することを選択した理由です)。
ドラッグ アンド ドロップ:ネイティブに実行できuitable
ますが、列でのみ実行できます (このリンクを参照してください)。これは恐ろしく見えると思いますが、ファイルが 1 つまたは 2 つしかない場合はうまくいくかもしれません。
それ以外の場合: 上記のようにボタンを使用するか、少しググって、行をドラッグできる他の Java オブジェクト ( 以外jTable
)があるかどうかを確認します。私は Java に詳しくないので、他の場所を探す必要があります。