在图中移动多个方框?

时间:2011-07-12 20:14:41

标签: matlab drag-and-drop figure

我已经拥有了在MATLAB中拖放图中的单个框所需的功能。我写的代码用几个方块填充了数字。通过另一个循环,我在图中填充了更多的框(以字符串形式保存不同的信息)。

这两组方框与我在其UserData中放置的数字相关(对应的数字;对于每个方框,还有另一组具有相同的UserData内容)。通过查找包含相同UserData(并因此关联它们)的框,我希望能够通过右键单击将第一组框的成员重新定位到相对于第二组框的相应成员的相同位置。我拖动的那个盒子(uicontextmenu)。

function recallfcn(hObject,eventdata)
for ydx=1:2
    diag_detail=get(gco,'UserData');   % This line should be in the drag fcn
    diag_pos=get(gco,'Position');      % So should this one (for current objects)
    xvar=diag_pos(1,1);
    yvar=diag_pos(1,2);
    detail=[diag_detail ydx]; 
    set(findobj('UserData',detail),'Position',[xvar+(ydx-1.5) yvar+0.5 0.8 0.8]);
end
end

% ydx is only there to add another level of detail as I'm actually looking to move     
% two boxes of the 'first kind', each of which have 2 numbers in user data, the first  
% number being the same, and the second number distinguishing the first box from the 
% second. The premise is the same.

3 个答案:

答案 0 :(得分:3)

我通常使用findall代替findobj,以防从外部看不到对象的句柄。除此之外,我不明白为什么你的代码不起作用。

以下是一个例子:

%# make a figure with two buttons, same userData
fh=figure,
uicontrol('userdata',[2 3],'parent',fh)
uicontrol('userData',[2 3],'units','normalized','position',[0.5 0.5,0.1 0.1],'parent',fh)

%# change color to red
set(findall(fh,'userData',[2 3]),'backgroundcolor','r')

%# move to the same position
set(findall(fh,'userData',[2 3]),'position',[0.3,0.3,0.1,0.1])

答案 1 :(得分:3)

As Jonas alludes to,对象的'HandleVisibility' property将确定对象是否显示在其父项的子项列表中,因此它是否会由FINDOBJ等函数返回。标准修复方法是使用函数FINDALL代替。

然而,'HandleVisibility' property在确定对象是否可以成为current object(即由函数GCO可返回)时也起作用。如果它设置为'off',则该对象不能成为当前对象。此外,如果对象的父图'HandleVisibility' property设置为'off',则其子项(包括所述对象)都不能成为当前对象。

如果'HandleVisibility'为所有对象和数字设置为'on''callback',那么我认为一切都应该正常。

答案 2 :(得分:0)

你应该反转x和y向量的ordre,你可以只使用一个循环,代码中的变换是:

x2=x(end:-1:1); % invers the ordre
y2=y(end:-1:1);

for i=1:length(x)

set(hLine,'xdata',x(i),'ydata',y(i)); % move the point using set
                                  % to change the cooridinates.

set(hLine2,'xdata',x2(i),'ydata',y2(i));

 M(i)=getframe(gcf);

end