我有一个应用程序,其中向用户显示SVG图像,他们需要根据呈现的内容填写两个编辑字段。由于该过程需要重复多次,因此我得出结论,如果用户交互仅需要键盘,那么速度和效率将是最好的。为此,我必须确保以下几点:
- 这个数字是焦点。
- 该选项卡 ⭾以正确的顺序循环元素(编辑 1 →编辑 2 →按钮(。
- 每当刷新图像时,都会聚焦正确的编辑字段。
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
可以在这里找到(披露:我是这个实用程序的合著者(。