只有编辑文本MATLAB GUI中的数字

时间:2017-01-02 13:59:41

标签: matlab matlab-guide

我在MATLAB GUI中有一个编辑文本。我希望用户只能写数字,每当他写一个文本字符时,立即删除这个最后一个字符。而且,我不知道如何使用这个代码(回调,按键等)。

谢谢!

1 个答案:

答案 0 :(得分:2)

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

以下是一个不完美的解决方法。它使用两个相同的编辑框,一个在另一个的顶部,但最顶部的框最初是隐藏的。可见编辑框的KeyPressFcn

  1. 按数字
  2. 过滤按键
  3. 在具有全局存储的字符串中累积有效的按键
  4. 将该字符串设置为隐藏编辑框的当前字符串
  5. 使隐藏的不可见编辑框可见,以便遮挡您在
  6. 中输入的那个

    CallBack功能

    1. 采用通常不可见框的字符串
    2. 设置始终可见的框'字符串等于该字符串
    3. 再次隐藏通常隐形的盒子
    4. 这是实施(从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 后)。