仅编辑文本MATLAB GUI中的数字
我在MatlabGUI中有一个编辑文本。我希望用户能够只写数字,每当他写一个文本字符时,最后一个字符会立即被删除。此外,我不知道用哪种函数来编写这段代码(回调、按键等)仅编辑文本MATLAB GUI中的数字,matlab,matlab-guide,Matlab,Matlab Guide,我在MatlabGUI中有一个编辑文本。我希望用户能够只写数字,每当他写一个文本字符时,最后一个字符会立即被删除。此外,我不知道用哪种函数来编写这段代码(回调、按键等) 谢谢大家! 如果不借助Java,这是不可能的。这是因为MATLAB无法访问uicontrol的键入字符串;您只能访问其当前字符串(即,在按Enter键或更改焦点后) 下面是一个不完善的解决方法。它使用两个相同的编辑框,一个在另一个之上,但最上面的框最初是隐藏的。可见编辑框的键按FCN: 仅过滤数字键盘上的按键 使用全局存储将有效
谢谢大家! 如果不借助Java,这是不可能的。这是因为MATLAB无法访问
uicontrol
的键入字符串;您只能访问其当前字符串(即,在按Enter键或更改焦点后)
下面是一个不完善的解决方法。它使用两个相同的编辑框,一个在另一个之上,但最上面的框最初是隐藏的。可见编辑框的键按FCN
:
回调
函数
- 因为你在看不见的地方打字,光标被隐藏了
- 选择文本并按backspace/delete键不起作用
- 这不是很节省资源
虽然可以使用Java(参见MATLAB god Yair Altman),但更简单、更常见的方法是接受用户输入的无效输入,并且只在
回调
函数中检查/更正它(即,在按下Enter键之后)。如果不使用Java,这是不可能的。这是因为MATLAB无法访问uicontrol
的键入字符串;您只能访问其当前字符串(即,在按Enter键或更改焦点后)
下面是一个不完善的解决方法。它使用两个相同的编辑框,一个在另一个之上,但最上面的框最初是隐藏的。可见编辑框的键按FCN
:
回调
函数
- 因为你在看不见的地方打字,光标被隐藏了
- 选择文本并按backspace/delete键不起作用
- 这不是很节省资源
回调
函数中检查/更正它(即,在按下Enter键之后)
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