Это невозможно без использования Java. Это связано с тем, что у MATLAB нет доступа к uicontrol
, набранному в строке; вы можете получить доступ только к своей строке (т. е. после нажатия Введите или смените фокус).
Ниже приведено неполное обходное решение. Он использует два одинаковых поля редактирования, один поверх другого, но самый верхний ящик изначально скрыт. 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
Это работает достаточно хорошо, но имеет некоторые недостатки:
- потому, что вы печатаете где-то вы не можете видеть, курсор скрыт
- выбора текста и нажав Backspace/удалить не работает
- это не очень ресурсосберегающим
Хотя возможно, используя Java (см. this post от MATLAB-god Yair Altman), более простой и общий способ сделать это - просто принять, что пользователь печатает неверный ввод и проверяет/исправляет его только в функции Callback
(т. е. после нажатия Введите).
Огромное спасибо – chsafouane
@chsafouane приветствуются! –