2

文字列のセル配列があります (実際には、ユーザーが選択したファイルのリストです)。次に、ユーザーがそのリストを手動で並べ替えることができるユーザー インターフェイス コントロールを表示したいと思います。

基本的に、指定されたファイルが処理される順序をユーザーが選択できるようにしたいと考えています。これを行うコードは既にありますか、またはこれを行う方法について何か良い提案はありますか?

理想的には、文字列 (ファイル名) のリストを表示し、1 つをクリックして上矢印または下矢印をクリックして、リスト内で上下に移動するか、ボーナス ポイント:P をドラッグして並べ替えることができます (私はそのようなものがmatlab GUIに存在するとは思わないが)。

4

1 に答える 1

2

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 に詳しくないので、他の場所を探す必要があります。

于 2012-10-23T07:01:17.173 に答える