2012-10-23 2 views
2

문자열 배열 (실제로 사용자가 선택한 파일 목록)이 있습니다. 그런 다음 사용자가 수동으로 해당 목록을 재정렬 할 수있는 사용자 인터페이스 컨트롤을 가져오고 싶습니다.Matlab에서 문자열의 셀 배열을 수동으로 배열하는 사용자 정의 함수

기본적으로 사용자는 주어진 파일이 처리되는 순서를 선택할 수 있기를 바랍니다. 이 작업을 수행하는 코드가 이미 있습니까? 아니면 아무에게도이 작업을 수행하는 방법에 대한 좋은 제안이 있습니까?

이상적으로 문자열 목록 (파일 이름)을 표시하고 위 ​​또는 아래 화살표를 클릭하여 목록에서 위 또는 아래로 이동하거나 보너스 포인트를 표시 할 수 있습니다. P 드래그를 허용 할 수 있습니다. 그들을 재주문 (비록 내가 MATLAB GUI를위한 존재 같은 의심).

답변

2

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에 익숙하지 않으므로 다른 곳을 봐야 할 것입니다.

관련 문제