Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅编辑文本MATLAB GUI中的数字_Matlab_Matlab Guide - Fatal编程技术网

仅编辑文本MATLAB GUI中的数字

仅编辑文本MATLAB GUI中的数字,matlab,matlab-guide,Matlab,Matlab Guide,我在MatlabGUI中有一个编辑文本。我希望用户能够只写数字,每当他写一个文本字符时,最后一个字符会立即被删除。此外,我不知道用哪种函数来编写这段代码(回调、按键等) 谢谢大家! 如果不借助Java,这是不可能的。这是因为MATLAB无法访问uicontrol的键入字符串;您只能访问其当前字符串(即,在按Enter键或更改焦点后) 下面是一个不完善的解决方法。它使用两个相同的编辑框,一个在另一个之上,但最上面的框最初是隐藏的。可见编辑框的键按FCN: 仅过滤数字键盘上的按键 使用全局存储将有效

我在MatlabGUI中有一个编辑文本。我希望用户能够只写数字,每当他写一个文本字符时,最后一个字符会立即被删除。此外,我不知道用哪种函数来编写这段代码(回调、按键等)


谢谢大家!

如果不借助Java,这是不可能的。这是因为MATLAB无法访问
uicontrol
的键入字符串;您只能访问其当前字符串(即,在按Enter键或更改焦点后)

下面是一个不完善的解决方法。它使用两个相同的编辑框,一个在另一个之上,但最上面的框最初是隐藏的。可见编辑框的
键按FCN

  • 仅过滤数字键盘上的按键
  • 使用全局存储将有效按键累积为字符串
  • 将该字符串设置为不可见编辑框的当前字符串
  • 使不可见的编辑框可见,以便它遮挡正在键入的编辑框
  • 它的
    回调
    函数

  • 获取通常不可见框的字符串
  • 将始终可见框的字符串设置为该字符串
  • 再次隐藏通常不可见的框
  • 以下是实现(大量借用):

    这项工作相当不错,但也有一些缺点:

    • 因为你在看不见的地方打字,光标被隐藏了
    • 选择文本并按backspace/delete键不起作用
    • 这不是很节省资源

    虽然可以使用Java(参见MATLAB god Yair Altman),但更简单、更常见的方法是接受用户输入的无效输入,并且只在
    回调
    函数中检查/更正它(即,在按下Enter键之后)。

    如果不使用Java,这是不可能的。这是因为MATLAB无法访问
    uicontrol
    的键入字符串;您只能访问其当前字符串(即,在按Enter键或更改焦点后)

    下面是一个不完善的解决方法。它使用两个相同的编辑框,一个在另一个之上,但最上面的框最初是隐藏的。可见编辑框的
    键按FCN

  • 仅过滤数字键盘上的按键
  • 使用全局存储将有效按键累积为字符串
  • 将该字符串设置为不可见编辑框的当前字符串
  • 使不可见的编辑框可见,以便它遮挡正在键入的编辑框
  • 它的
    回调
    函数

  • 获取通常不可见框的字符串
  • 将始终可见框的字符串设置为该字符串
  • 再次隐藏通常不可见的框
  • 以下是实现(大量借用):

    这项工作相当不错,但也有一些缺点:

    • 因为你在看不见的地方打字,光标被隐藏了
    • 选择文本并按backspace/delete键不起作用
    • 这不是很节省资源
    虽然可以使用Java(参见MATLAB god Yair Altman),但更简单、更常见的方法是接受用户输入的无效输入,并且只在
    回调
    函数中检查/更正它(即,在按下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