2017-01-02 4 views
0

У меня есть текст редактирования в графическом интерфейсе MATLAB. Я хочу, чтобы пользователь мог писать только числовые значения и всякий раз, когда он пишет текстовый символ, этот последний символ немедленно удаляется. Более того, я не знаю, в какой функции можно поставить этот код (callback, keypress и т. Д.).Только цифры в тексте редактирования MATLAB GUI

Спасибо!

ответ

2

Это невозможно без использования Java. Это связано с тем, что у MATLAB нет доступа к uicontrol, набранному в строке; вы можете получить доступ только к своей строке (т. е. после нажатия Введите или смените фокус).

Ниже приведено неполное обходное решение. Он использует два одинаковых поля редактирования, один поверх другого, но самый верхний ящик изначально скрыт. KeyPressFcn видимого окна редактирования:

  1. фильтрует нажатия клавиш на числовом только
  2. накапливает действительные нажатия клавиш в строке с глобальным хранением
  3. устанавливает, что строки в текущую строку невидимого окна редактирования
  4. Делает невидимым, что окно редактирования видимым, так что он закупоривает тот, который вы набираете в

его CallBack функции, то

  1. принимает строку нормально-невидимого поля
  2. Устанавливает всегда видимые окна»строки, равные ту строку
  3. Скрывает нормально невидимое окно снова

Вот реализации (Обильно заимствованные из 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 (т. е. после нажатия Введите).

+0

Огромное спасибо – chsafouane

+0

@chsafouane приветствуются! –

Смежные вопросы