Matlab 检查';编辑';当它处于活动状态时
我在使用Matlab的Matlab 检查';编辑';当它处于活动状态时,matlab,user-interface,Matlab,User Interface,我在使用Matlab的uicontrol处理时遇到了一些问题。情况如下: 我的(编程)GUI包含一个可编辑文本字段。此字段最初包含一个数值,并且应始终包含一个。为了确保重复检查'String'参数,将其转换为数字,并重新输入uicontrol的'String'属性。每当用户在文本字段中输入可见字符时,就会发生这种情况 此外,程序应在任何时候注意所述文本字段的当前值是否与存储在存储器中的原始值不同。如果用户关闭图形,将打开一个模式对话框,询问是否要保存对该值的更改或放弃该更改。如果随后重新打开图形
uicontrol
处理时遇到了一些问题。情况如下:
我的(编程)GUI包含一个可编辑文本字段。此字段最初包含一个数值,并且应始终包含一个。为了确保重复检查'String'
参数,将其转换为数字,并重新输入uicontrol
的'String'
属性。每当用户在文本字段中输入可见字符时,就会发生这种情况
此外,程序应在任何时候注意所述文本字段的当前值是否与存储在存储器中的原始值不同。如果用户关闭图形,将打开一个模式对话框,询问是否要保存对该值的更改或放弃该更改。如果随后重新打开图形(通过GUI的其余部分),则文本字段的值将与之前的值相同(如果用户放弃了更改),或者是用户定义的更改值
在某些情况下,由于一种奇怪的行为,uicontrol
的'String'
属性仅在uicontrol
失去焦点后更新。如果用户希望在该GUI上执行其他操作,或者知道如何处理,则这不是问题。我也可以只在文本字段失去焦点后更新为有意义的数值。问题是,当我在更改文本字段的值后通过右上角的Windows红色X按钮关闭图形,但没有首先单击其他位置时,
'String'
值永远不会更新,因此CloseRequestFcn
不会注意到更改,只会关闭窗口。即使暂停高达100毫秒,然后从CloseRequestFcn
中显式调用文本字段的Callback
也无济于事,它只是在没有对话框的情况下关闭。反之亦然,如果我确实更改了该值,请单击其他位置,然后再将其更改回来,它将显示对话框,除非我先再次单击其他位置
因此,问题是:当我单击Windows提供的红色X按钮时,如何确保uicontrol
正确更新/执行其回调
还有一个额外的问题:我如何“动态”执行此回调,以便在用户输入任何不可能的值(例如,除e
和I
之外的字母)后立即更正这些值
这里是我的GUI中导致问题的独立部分,复制到一个名为“guitest.m”的文件中并运行,以测试我所说的内容
function guitest
changed = false; %// tracks changes to catch closing without saving
startval = 1; %// the starting value
handles.figure = figure('Resize','off','Toolbar','none','Menu',...
'none','Name','Change text field value','CloseRequestFcn',...
@closefig,'Visible','off'); %// not visible until fully created
handles.textfield = uicontrol('Style','edit','Units','normalized',...
'Parent',handles.figure,'String',startval,...
'Position',[.4 .6 .2 .1],'Callback',@changedValue);
handles.button = uicontrol('String','Push me','Units','normalized',...
'Parent',handles.figure,'Position',[.4 .3 .2 .2],'Callback',@dispval);
%// all done, display GUI
set(handles.figure,'Visible','on');
%// callback functions
function closefig(~,~) %// Quit program
pause(0.1);
changedValue(handles.textfield); %// update fields
if changed
disp('Do you really want to close?'); %// save dialog
else
delete(handles.figure); %// this is used as CloseRequestFcn!
end
end
function changedValue(hObject,~)
newval = uint16(str2double(get(hObject,'String')));
changed = (startval ~= newval);
end
function dispval(~,~)
disp('With buttons inside the GUI, it works properly:');
disp(get(handles.textfield,'String'));
disp(changed);
end
end
在关闭函数中强制更改GUI焦点会提供正确的行为吗?从文件中:
uicontrol(uich)
将焦点放在句柄指定的uicontrol
,
uich
为了获得“奖金”,您可能必须利用底层Java。请参阅《来自未记录的Matlab》的文章。这是一个好主意,我明天回到我的Matlab PC时将对此进行测试。它本身不工作,但在强制焦点更改后,它与
暂停(0.001)
(可能任何暂停时间都可以)相结合,可以正确识别更改并更新字段。非常感谢。