App designer Key-press callback
古いコメントを表示
I have a uifigure with some buttons and an axes, which show a pointcloud in realtime. I added to the uifigure a Key-press callback, so that when the keyboard is pressed, some actions are performed. This works generally fine. My problem is that I need to click a pushbutton to start the pointcloud streaming. After pushing the button, the Key-press callback does not work anymore, maybe because the focus is on the button, and not on the figure. Then, if I click with the mouse on the axis, then the Key-press callback works again: is there a way to avoid or automatize this mouse click? I found the solution exploiting java (import java.awt.Robot; import java.awt.event.*; mouse = Robot;), i.e. programmatically move the mouse pointer to the axis and click it, but it is not the proper way to solve my issue and I would like something more robust. Any suggesiont?
4 件のコメント
Mario Malic
2021 年 3 月 10 日
編集済み: Mario Malic
2021 年 3 月 10 日
Instead of KeyPressFcn callback on the Axes, set it on the uifigure, so the key is registered wherever you click in the uifigure. You also might need to filter out the Sources, for example, if your Source is a button, then it will trigger a callback (not completely sure), when you pressed it.
Paolo Neri
2021 年 3 月 10 日
Kelsey Bettridge
2021 年 12 月 13 日
Did you ever figure this one out? I'm having the same problem. I think you are correct about the focus, but I'm having trouble coding a workaround to get the focus back on the figure. Maddening!
Paolo Neri
2021 年 12 月 14 日
回答 (1 件)
Attached is a simple demo app that contains a KeyPressFcn assigned to the uifigure and a button. The KeyPressFcn merely prints the key pressed to the command window.
At the end of the ButtonPushed callback function, the figure is activated using figure(app.UIFigure) so that it continues to respond to key strokes. This works in Matlab R2021a and later.

10 件のコメント
Paolo Neri
2021 年 12 月 15 日
Adam Danz
2021 年 12 月 15 日
Have you tested my demo? I tested it in R2021a and it works as described. That suggests there may be a problem with your implementation of the solution within your app or perhaps the callback function is calling an external file that is interfering. The call to figure() should be at the end of the callback function, assuming execution reaches the end of the function.
Alternatively, you could add
figCleanup = onCleanup(@()figure(app.UIFigure));
at the top of the button callback function and the figure will become current as soon as execution exits the callback function.
Adam Danz
2021 年 12 月 15 日
Sorry, I just realized you wrote "R2020a". I don't have that release on my machine but I have R2020b and now I see the behavior you're describing. Let me rethink it....
Kelsey Bettridge
2021 年 12 月 15 日
Hi Adam! Thanks so much. I had tried this but was using R2019b. When I switched to R2021a, it worked. Hopefully this helps others who encounter this issue- don't be lazy like me and not update to the latest version :)
Adam Danz
2021 年 12 月 15 日
Sorry @Paolo Neri, I haven't succeeded in coming up with a workaround for older releases. I tried using a java robot to activate the figure but couldn't get it to work; I tried using UI Test gestures to simulate a mouse click on the figure space but that testing framework is not supported with grapics obj callbacks. And I tried a handfull of other solution to make the uifigure the current object in r2020b but without success.
Paolo Neri
2021 年 12 月 16 日
Seda Camalan
2023 年 2 月 6 日
Thank you for your answer!
Actually, it works in Matlab 2021 but it doesn't work in Matlab 2022a! I'm a little confused because usually newer versions contain the previous features!
Do you have any solution for 2022?
I just tested it in R2022a and didn't come across any issues. The app has two new features.
- When the app is in focus, when you type on the keyboard the characters will appear in the command window.
- When you press the button, it merely puts the app figure in focus. Since the app figure is already in focus, you won't see anything happen when pressing the button.
If you are having trouble with the first item, make sure the app figure is in focus - it should have a blue title bar.
Jixiong Su
2023 年 11 月 3 日
編集済み: Jixiong Su
2023 年 11 月 3 日
Thank you for your answer!
However, In 2023b, It would be better to use WindowsKeyPress rather than KeyPress.
Zel Hurewitz
2024 年 7 月 17 日
編集済み: Zel Hurewitz
2024 年 7 月 17 日
In 2024a, zooming in a UIAxis seems to break the UIFigureWindowsKeyPress callback, maybe also for a similar reason about the figure being in focus.
カテゴリ
ヘルプ センター および File Exchange で Interactive Control and Callbacks についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
