Cant define figure position on second monitor with Mac OsX Using R2022b Update 3

3 visualizaciones (últimos 30 días)
I have posed this question before and not received a useable answer.
I am trying to define the position of a new figure on a second monitor. When I define the position as in :
fig1h=figure(1);
set(fig1h,'Position',[238 1457 1197 420]);
when I execute this code segement the figure appears on the home screen not on the screen defined by the position. I get the position by calling:
get(fig1h)
after the function has executed,
If I execute:
set(fig1h,'Position',[238 1457 1197 420]);
from the command line it moves the figure to the desired location.
Has anyone else experienced this problem and more importantly is there a fix?
MT
  1 comentario
John O'Hair
John O'Hair el 5 de Ag. de 2023
Movida: Voss el 5 de Ag. de 2023
I have the same problem in 2023a
g = groot;
f = figure('Position',g.MonitorPositions(2,:));
will place the figure at the edge of the primary monitor closest to the second monitor.
I've tried to use set(f,'Position',g.MonitorPositions(2,:)) and f.Position = g.MonitorPositions(2,:) with and without a following drawnow command.
It works in the command line but not from within the script.

Iniciar sesión para comentar.

Respuestas (3)

Walter Roberson
Walter Roberson el 30 de Dic. de 2022
If a graphics command does not work while executed inside a function or script, but the same command works at the command line, then there are two common causes for that:
  1. The command might contain a reference to a variable that lives in the base workspace that is not in scope inside the function or script (which is obviously not your situation here); OR
  2. You might need a drawnow() to trigger graphics update (possibly the solution here)
Note: we recommend against hard-coding off-screen positions. We recommend instead that you
locations = get(groot, 'MonitorPositions');
new_position = [locations(2,1) + x_offset, locations(2,2) + y_offset, figure_width, figure_height];

John O'Hair
John O'Hair el 5 de Ag. de 2023
I've tried
g = groot;
f = figure;
f.Position = [g.MonitorPositions(2,1)+10, g.MonitorPositions(2,2)+10, g.MonitorPositions(2,3)-20, g.MonitorPositions(2,4)-20];
% which is what is suggested
f.WindowState = "maximized";
All that does is maximize the figure in the primary monitor. This is clearly a bug on the mac since doing the same commands in the command line always provides the expected result.
  1 comentario
John O'Hair
John O'Hair el 5 de Ag. de 2023
This seems to work...
g = groot;
f = figure;
f.Position = [g.MonitorPositions(2,1)+10, g.MonitorPositions(2,2)+10, g.MonitorPositions(2,3)-20, g.MonitorPositions(2,4)-20];
drawnow;
set(f,'Position',g.MonitorPositions(2,:));
drawnow;
f.WindowState = "maximized";
drawnow;
It appears the drawnow command must be repeated at least twice. The third one may not be necessary, but on my Mac in 2023a, this is the most stable method to force the figure into the second monitor.
It's a solution...

Iniciar sesión para comentar.


Vincenzo
Vincenzo el 17 de En. de 2024
I found a workaround:
monitorNumber = 2; % Number of the monitor as identified by the OS
monitors = get(0, "MonitorPositions"); % Get the position of the monitors extrema (each row is a monitor)
fig = figure(); % Create a new figure
get(fig); % Get figure information
pause(0.5); % <------ This pause let Matlab draw the figure on the main monitor
set(fig, "Position", monitors(monitorNumber, :)); % Move and resize the figure to desired monitor
This code specifically resizes the figure so that it spans the entire chosen monitor, but it can be easily modified.

Categorías

Más información sobre App Building en Help Center y File Exchange.

Productos


Versión

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by