2012-10-23 17 views
2

我有一个字符串的单元数组(实际上是用户选择的文件列表)。然后,我想调出一个用户界面控件,允许用户手动重新排列该列表。在Matlab中手动排列字符串单元数组的用户控制函数

基本上我希望用户能够选择处理给定文件的顺序。是否有一段代码已经这样做,或者有没有人有任何好的建议,如何做到这一点?

理想情况下,它会显示字符串列表(文件名),您可以点击一个并点击向上或向下箭头在列表中向上或向下移动它,或者用于奖励点:P它可以拖动他们重新排序(尽管我怀疑matlab GUI存在这样的事情)。

回答

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 

灵感(部分)来自here

如果你不喜欢嵌套函数,很容易将它们重新定义为子函数,但是你必须传递句柄(这就是为什么我选择首先使用嵌套函数的原因)。

拖动和坠:它可以被本地完成,但仅仅在uitable列(见this link)。我认为这看起来很可怕,但如果你只有一个或两个文件,可能会工作。

否则:您可以使用按键如上图所示,或张望了一下谷歌,看看是否有一些其他的Java对象(不是jTable之外)确实允许你拖约行。我对Java并不熟悉,所以你不得不去其他地方看看。