如何将焦点设置在 uifigure 中的特定元素上?



我有一个应用程序,其中向用户显示SVG图像,他们需要根据呈现的内容填写两个编辑字段。由于该过程需要重复多次,因此我得出结论,如果用户交互仅需要键盘,那么速度和效率将是最好的。为此,我必须确保以下几点:

  1. 这个数字是焦点。
  2. 选项卡 ⭾以正确的顺序循环元素(编辑 1 →编辑 2 →按钮(。
  3. 每当刷新图像时,都会聚焦正确的编辑字段。

1st 要求可以通过切换图形可见性来满足,如此处所述。
第二个要求也相当容易满足,并且仅要求图形元素按特定顺序定义,如此处(对于 uifigures(和此处(对于图形(所讨论的那样。

我的困难在于第 3要求,特别是 - 我不知道如何确保在需要时集中所需的编辑字段。请考虑以下类以供参考,其中focusControl方法只是一个占位符。

classdef SVGAxisLimit < handle

properties (GetAccess = private, SetAccess = immutable)
hF (1,1)
hI (1,1) matlab.ui.control.Image
hLL (1,1) matlab.ui.control.NumericEditField
hRL (1,1) matlab.ui.control.NumericEditField
hDone (1,1) matlab.ui.control.Button
end

methods    
function obj = SVGAxisLimit()
% Create figure:
hF = uifigure('WindowState','maximized','Color','w'); drawnow;

% Create image:      
hI = uiimage(hF, 'Position', [1,100,hF.Position(3),hF.Position(4)-100]);

% Create controls:
uilabel(hF, 'HorizontalAlignment', 'left', 'Position', [600 20 150 42],...
'Text', 'Left Limit:', 'FontSize', 22);

% Create LeftLimitEditField
hLL = uieditfield(hF, 'numeric', 'Position', [710 20 80 42], 'FontSize', 22);
% Create RightLimitEditFieldLabel
uilabel(hF, 'HorizontalAlignment', 'left', 'Position', [900 20 150 42],...
'Text', 'Right Limit:', 'FontSize', 22);
% Create RightLimitEditField
hRL = uieditfield(hF, 'numeric', 'Position', [1025 20 80 42], 'FontSize', 22);
% Create DoneButton
hDone = uibutton(hF, 'push', 'Text', 'Done', 'Position', [1200 20 80 42], ...
'FontWeight', 'bold', 'FontSize', 22, 'ButtonPushedFcn', @(varargin)uiresume(hF));

% Store handles:
obj.hF = hF;
obj.hI = hI;
obj.hLL = hLL;
obj.hRL = hRL;
obj.hDone = hDone;
end    
end

methods (Access = public)
function [realLims] = showSVG(salObj, svgPath)
salObj.hI.ImageSource = svgPath;
% Focus left edit field
SVGAxisLimit.focusControl(salObj.hLL);
% Wait for a click on "done"
uiwait(salObj.hF);
% When resume, capture values:
realLims = [salObj.hLL.Value, salObj.hRL.Value];
end
end  

methods (Access = private, Static = true)
function [] = focusControl(hObject)
% hObject is the handle of the uicontrol which needs to be focused
% ???
end
end
end

我正在使用 MATLAB R2020a。

附言我决定为此使用 uifigure,因为它们的uiimage组件本身支持 SVG 的呈现(尽管存在避免此组件的解决方法(。

看到UIFigure主要是一个网页,事实证明,.focus().select()的JavaScript Web API方法在这里很有用。剩下的唯一困难是找到某种方法来引用有问题的 Web 元素(小部件(。幸运的是,与 R2020a 中的编辑字段对应的 HTML 元素由唯一的id属性标识,这使得使用非常简单的 DOM 命令(例如getElementById(可以轻松引用它们。总结:

function [] = focusControl(hObject)
% hObject is the handle of the uicontrol which needs to be focused
[hWin, widgetID] = mlapptools.getWebElements(hObject);
hWin.executeJS(sprintf(...
'W = document.getElementById("%s"); W.focus(); W.select();', widgetID.ID_val));
end

mlapptools可以在这里找到(披露:我是这个实用程序的合著者(。

相关内容

  • 没有找到相关文章

最新更新