How to select multiple edit fields?
6 次查看(过去 30 天)
显示 更早的评论
Hi,
In my user interface, users can specify a dimension, for exam m x n, then I draw a m x n table, where each element is an edit field such that users can change values in any edit field.
% Horizontal margin of the canavas
hMargin = 0.02;
% Vertical margin of the canavas
vMargin = 0.02;
% Element width
elemWidth = min((1-2*hMargin) / n, (1-2*vMargin)/m);
% Create an edit field for each entry
for j = 1 : m
for i = 1 : n
pos = [hMargin+(j-1)*elemWidth 1-vMargin-i*elemWidth elemWidth elemWidth];
e = uicontrol('Style','edit',...
'Units','normalized',...
'Position',pos);
end
end
But sometimes, users might want to have a row with same values:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/873860/image.png)
for example in the image, users will have to change the values on row 5 one by one from 0.5 to 1.
Is there a way to have something like a brush, that for the places with the same values, after modifying one edit field, the others can be simply "brushed" to have the same values? Or is there a way that users can jump between each edit field with the arrow keys (currently they always have to use a mouse to select)?
Thank you very much!
回答(1 个)
T.Nikhil kumar
2023-10-30
Hello,
I understand that you want to know if after modifying one edit field, the other fields in the same row with same value can be made to have the same edited value or if users can jump between each edit field with the arrow keys.
I can suggest you a way to achieve the latter task. You can allow users to navigate through the cells using the arrow keys by leveraging the ‘KeyPressFcn’ property of the edit fields to capture keyboard input(arrows) and navigate accordingly. Refer to the below mentioned procedure:
- Add a ‘KeyPressFcn’ argument and pass a callback function’s handle as its value, for each edit field. This callback will listen for arrow key presses.
- In the definition of the callback function, you can detect when an arrow key is pressed and programmatically determine the next cell to focus on and set focus to that cell using the ‘uicontrol’ function.
Refer to the below mentioned code snippet for better understanding:
% Horizontal margin of the canavas
hMargin = 0.02;
% Vertical margin of the canavas
vMargin = 0.02;
%Define rows and columns number
m=5;
n=5;
% Element width
elemWidth = min((1-2*hMargin) / n, (1-2*vMargin)/m);
% Create an edit field for each entry
for j = 1 : m
for i = 1 : n
pos = [hMargin+(j-1)*elemWidth 1-vMargin-i*elemWidth elemWidth elemWidth];
e = uicontrol('Style','edit',...
'Units','normalized',...
'Position',pos,'KeyPressFcn', @(src, event)navigateEditFields(src, event, m, n, i, j));
end
end
Refer to the definition of an example callback function ‘navigateEditFields’:
function navigateEditFields(src, event, rows, columns, i, j)
% Get the key that was pressed
key = event.Key;
% Check the arrow key direction
switch key
case 'uparrow'
% Move to the edit field above
if j > 1
j = j - 1;
uicontrol(src.Parent.Children(i*j+(rows-j)*(i-1)));
end
case 'downarrow'
% Move to the edit field below
if j < rows
j = j + 1;
uicontrol(src.Parent.Children(i*j+(rows-j)*(i-1)));
end
case 'leftarrow'
% Move to the edit field on the left
if i > 1
i = i - 1;
uicontrol(src.Parent.Children(i*j+(rows-j)*(i-1)));
end
case 'rightarrow'
% Move to the edit field on the right
if i < columns
i = i + 1;
uicontrol(src.Parent.Children(i*j+(rows-j)*(i-1)));
end
end
end
You can learn more about setting focus and defining callbacks for ‘uicontrol’ object here:
Hope this helps!
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Migrate GUIDE Apps 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!