我在MATLAB GUI中有一个编辑文本。我希望用户只能写数字,每当他写一个文本字符时,立即删除这个最后一个字符。而且,我不知道如何使用这个代码(回调,按键等)。
谢谢!
答案 0 :(得分:2)
如果不诉诸Java,这是不可能的。那是因为MATLAB无法访问uicontrol
类型的字符串;您只能访问其当前字符串(即,在按 Enter 或更改焦点后)。
以下是一个不完美的解决方法。它使用两个相同的编辑框,一个在另一个的顶部,但最顶部的框最初是隐藏的。可见编辑框的KeyPressFcn
:
其CallBack
功能
这是实施(从here借来的):
function GUI_tst
% Create new GUI
G.fh = figure('menubar' , 'none',...
'units' , 'normalized', ...
'position', [.4 .4 .2 .2]);
% The actual edit box
G.eh1 = uicontrol('style' , 'edit',...
'units' , 'normalized', ...
'position' , [.1 .4 .8 .2],...
'string' , '',...
'KeyPressFcn', @kpr,...
'Callback' , @cll);
% The "fake" edit box
G.eh2 = copyobj(G.eh1, G.fh);
set(G.eh2, 'Visible', 'off');
% Its string (global)
G.eh_str = '';
guidata(G.fh, G);
end
% "Real" edit box' KeyPressFcn()
function kpr(~, evt)
if isempty(evt.Character)
return; end
G = guidata(gcbf);
% Occlude the "real" editbox with the "fake" one
set(G.eh2, 'visible', 'on');
% Accumulate global string if keys are numeric
if strcmp(evt.Key,'backspace')
G.eh_str = G.eh_str(1:end-1);
elseif isempty(evt.Modifier) && ...
any(evt.Character == char((0:9)+'0') )
G.eh_str = [G.eh_str evt.Character];
end
% Set & save new string
set(G.eh2, 'string', G.eh_str);
guidata(gcbf,G);
end
% "Real" edit box' CallBack()
function cll(~,~)
G = guidata(gcbf);
% Set the "real" box' string equal to the "fake" one's,
% and make the "fake" one invisible again
set(G.eh1, 'String', get(G.eh2, 'String'));
set(G.eh2, 'visible', 'off');
end
这种方法运作得相当好,但它有一些缺点:
尽管可以使用Java(参见MATLAB-god Yair Altman的this post),但更简单和更常见的方法是接受用户输入的无效输入,并且只检查/纠正它在Callback
函数中(即按 Enter 后)。