我写了一个脚本,返回了一个图中的几个文本框。文本框是可移动的(我可以拖放它们(,它们的位置由输入矩阵中的数据预先确定(输入矩阵的数据通过嵌套for循环应用于框的各个位置(。我想创建一个矩阵,它最初是输入矩阵的副本,但在我通过拖动框来更改框的位置时会更新。我该如何更新他们的立场?这是的整个脚本
function drag_drop=drag_drop(tsinput,infoinput)
[x,~]=size(tsinput);
dragging = [];
orPos = [];
fig = figure('Name','Docker Tool','WindowButtonUpFcn',@dropObject,...
'units','centimeters','WindowButtonMotionFcn',@moveObject,...
'OuterPosition',[0 0 25 30]);
% Setting variables to zero for the loop
plat_qty=0;
time_qty=0;
k=0;
a=0;
% Start loop
z=1:2
for idx=1:x
if tsinput(idx,4)==1
color='red';
else
color='blue';
end
a=tsinput(idx,z);
b=a/100;
c=floor(b); % hours
d=c*100;
e=a-d; % minutes
time=c*60+e; % time quantity to be used in 'position'
time_qty=time/15;
plat_qty=tsinput(idx,3)*2;
box=annotation('textbox','units','centimeters','position',...
[time_qty plat_qty 1.5 1.5],'String',infoinput(idx,z),...
'ButtonDownFcn',@dragObject,'BackgroundColor',color);
% need to new=get(box,'Position'), fill out matrix OUT of loop
end
fillmenu=uicontextmenu;
hcb1 = 'set(gco, ''BackgroundColor'', ''red'')';
hcb2 = 'set(gco, ''BackgroundColor'', ''blue'')';
item1 = uimenu(fillmenu, 'Label', 'Train Full', 'Callback', hcb1);
item2 = uimenu(fillmenu, 'Label', 'Train Empty', 'Callback', hcb2);
hbox=findall(fig,'Type','hggroup');
for jdx=1:x
set(hbox(jdx),'uicontextmenu',fillmenu);
end
end
new_arr=tsinput;
function dragObject(hObject,eventdata)
dragging = hObject;
orPos = get(gcf,'CurrentPoint');
end
function dropObject(hObject,eventdata,box)
if ~isempty(dragging)
newPos = get(gcf,'CurrentPoint');
posDiff = newPos - orPos;
set(dragging,'Position',get(dragging,'Position') + ...
[posDiff(1:2) 0 0]);
dragging = [];
end
end
function moveObject(hObject,eventdata)
if ~isempty(dragging)
newPos = get(gcf,'CurrentPoint');
posDiff = newPos - orPos;
orPos = newPos;
set(dragging,'Position',get(dragging,'Position') + [posDiff(1:2) 0 0]);
end
end
end
% Testing purpose input matrices:
% tsinput=[0345 0405 1 1 ; 0230 0300 2 0; 0540 0635 3 1; 0745 0800 4 1]
% infoinput={'AJ35 NOT' 'KL21 MAN' 'XPRES'; 'ZW31 MAN' 'KM37 NEW' 'VISTA';
% 'BC38 BIR' 'QU54 LON' 'XPRES'; 'XZ89 LEC' 'DE34 MSF' 'DERP'}
如果我正确理解你(如果我不正确,请发布一些代码(,那么你所需要的就是一个set/get组合。
如果boxHandle
是文本框对象的句柄,那么您可以通过以下方式获取其当前位置:
pos = get (boxHandle, 'position')
其中pos
是[x,y,width,height]的输出数组。为了设置到一个新的位置,您使用:
set (boxHandle, 'position', newPos)
其中newPos
是所需位置的阵列(具有与pos
相同的结构(。
编辑
关于更新矩阵,由于您有移动对象的句柄,因此您实际上可以访问特定的文本框。
创建每个文本框时,设置一个名为"UserData"的属性,该属性具有用于该框的tsinput
的关联索引。在您的嵌套for循环中添加此
set (box, 'UserData', [idx, z]);
盒子创建后,在moveObject
回调中通过获取数据
udata = get(dragging,'UserData');
然后udata
包含要更新的元素的索引。