KeyPressFcn and WindowKeyPressFcn not working

36 次查看(过去 30 天)
I have a GUI (using the old figure, not uifigure). The figure has a KeyPressFcn to do some action.
So I have a pushbutton, and after clicking it I want to hide the button, so its callback turns off its visibility ('Visible', 'off').
When that happens, the KeyPressFcn (or WindowKeyPressFcn I also tried it) if the figure stops working. No matter what I do, I can't recover the focus.
So this is what I tried, and nothing worked, even with everything combined:
set(figHandle, 'CurrentObject', figHandle)
set(figHandle, 'CurrentObject', pushbuttonHandle)
figure(figHandle)
gco(figHandle)
gcf(figHandle)
figHandle.Visible = 'off'
figHandle.Visible = 'on'
drawnow
NOTHING WORKS.
Only way to make it work again is clicking the figure. But thats exactly what I DONT want to do. I must not click the figure after clicking the pushbutton, at least before the desired keypress.
However, if I enter debubg mode using breakpoints, then this works:
set(figHandle, 'CurrentObject', figHandle)
figure(figHandle)
But it does not work if not in debug mode. I don't understand this behaviour. I know removing visbility to objects have some strange side effects. But it should never remove permanently focus from a figure.
Why does it work in debugging mode, but not in normal mode?
Matlab R2020b
  2 个评论
Voss
Voss 2024-2-29
Rather than setting the pushbutton invisible in its callback, try setting its position to something outside the figure, e.g., [-10 -10 1 1], and see if that changes anything.
André
André 2024-3-8
Its a possible option, maybe I will test it later.
I ended up using virtual mouse clicks using Java to recover the focus of the figure. I don't like such clumsy solutions, but thats the only way I figured out.

请先登录,再进行评论。

采纳的回答

Divyajyoti Nayak
Divyajyoti Nayak 2024-11-14,9:10
Hi @André,
From what I understand, you want the focus to come back to the parent figure after the button has been clicked, this should give the desired functionality. I could not find any direct function that restores focus to the figure like the ‘focus’ function which works for ‘uifigure but I did find a work around.
Here’s a sample code to help you out:
  • Initial setup of the GUI
f = figure;
f.KeyPressFcn = @keyPress;
btn = uicontrol(f,'Style','pushbutton','String','Hide','Callback',@btnCallback);
function btnCallback(src, event)
src.Visible = 'off';
  • The ‘set’ function can be used to set the ‘enable’ property to ‘off’ which disables the button. This removes the focus from the button.
set(src, 'Enable', 'off');
  • drawnow’ updates the figure bringing the focus back onto it
drawnow update;
  • If the button is still needed, it can be enabled without losing focus from the figure using the ‘set’ function again:
set(src, 'Enable', 'on');
end
function keyPress(src,event)
disp("key pressed");
end
For more information on this workaround, you can check out this MATLAB Answer post:
  1 个评论
André
André 2024-11-16,18:42
Seems to do the trick. I was using Java to simulate mouse clicks and get focus, but it was far from perfect...

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Migrate GUIDE Apps 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by