Borrar filtros
Borrar filtros

How do I use the "ButtonDownFcn" for a plot in App Designer?

185 visualizaciones (últimos 30 días)

How do I use the "ButtonDownFcn" for a plot in App Designer? I am not sure how or, more importantly, where to define the callback function. I tried changing the "ButtonDownFcn" property for the axis, but the UIAxes in App Designer does not have any callbacks.

Respuesta aceptada

MathWorks Support Team
MathWorks Support Team el 21 de Nov. de 2019
You are correct that there is no "ButtonDownFcn" for a UIAxes. Thus, stick to using the "ButtonDownFcn" with your plot object.
To start, create a plot in your app's StartupFcn and define the plot's "ButtonDownFcn" with an associated callback function:
The key here is _where _you define this callback function. If you simply add a new public/private function in Code View, the plot object will be unable to find the function when the callback is triggered, and you will get an error. This is because your app is set up as a class in App Designer, and thus, your callback will be defined as a class method, not an ordinary function.
The easiest alternative is to define your callback function as a nested function, located inside the StartupFcn. Check out the example below, in which I plot a parabola. If a user clicks on the parabola, a nested callback will be triggered that adds the x- and y-coordinates to a UITable, which lists the coordinates of all points that have been clicked so far.
function startupFcn(app)
% create plot with line object
x = linspace(-5,5);
y = -1 * x.^2;
plot(app.UIAxes,x,y,'ButtonDownFcn',@mouse_click);
% define callback as nested func
function mouse_click(~,eventData)
% get coordinates of click
coords = eventData.IntersectionPoint;
% do something with the coordinates (e.g. add coordinates to table)
app.UITable.Data(end+1,:) = [coords(1),coords(2)];
end
end
To create run this example yourself, simply add a UIAxes and a UITable to your figure in the Design View of App Designer. Then add the code above to a StartupFcn.
Also, for an alternative method of getting clicked points, see this related MATLAB Answers post:

Más respuestas (1)

Cris LaPierre
Cris LaPierre el 19 de Nov. de 2021
@Kyle: For images, you need to set the image object HitTest property to 'off' so the clicks can pass through the image to the axis, where the callback function has been added.
@Benjamin Gansemer: Like image objects, lines also have a HitTest property. If your callback is working fine except for when you click on the line, try setting the line's HitTest property to 'off'.

Categorías

Más información sobre Interactive Control and Callbacks en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by