Как получить границы окна оси в JFrame?

Я получил ответ на предыдущий вопрос . Однако для получения этих координат (размер и положение окна оси в случае axis equal) нам нужно сделать некоторые относительно громоздкие вычисления. Однако, поскольку графика MATLAB основана на Java, мы можем получить доступ к свойствам Java. Я обнаружил, что если мы будем использовать это в MATLAB:

jFrame = get(gcf,'JavaFrame');
BoxHeight = jFrame.getAxisComponent.getHeight;
BoxWidth = jFrame.getAxisComponent.getWidth;

мы можем получить ширину и высоту окон чертежей (возможно, это может быть связано с компонентами оси). Но они отличаются от значения get(gcf, 'Position') или get(gca, 'Position') в случае единиц пикселя. Я не эксперт в Java (я также безуспешно пытался найти эти свойства, используя Altman findjobj).

Таким образом, у меня есть два вопроса:

  • Почему высота и ширина окна фигуры (может быть, это поле оси), полученные из свойств MATLAB и Java, не являются одинаковыми (по крайней мере, они являются целыми числами в Java и номерами с плавающей запятой в MATLAB)?

Например:

hf=figure('units','pixels'); ha=gca(hf);
set(ha,'units','pixels');
get(hf,'position')
get(ha,'position')

ans =

488   342   560   420
73.8000   47.2000  434.0000  342.3000`

тогда как BoxHeight=525, BoxWidth=700 и сдвиг всегда равен нулю (alignmentX=0.0 и alignmentY=0.0).

  1. Как получить точный размер и положение осевых окон, нанесенных в MATLAB с помощью Java?

Ответ 1

В MATLAB оба параметра figure и axes имеют свойство, называемое Position, но это не одно и то же:

get(hf,'position') даст вам позицию окна фигуры на экране.
get(ha,'position') вернет положение осей в окне рисунка.

Следовательно, вывод кода

hf=figure('units','pixels');
ha=gca(hf);
set(ha,'units','pixels');
hfPos = get(hf,'position')
haPos = get(ha,'position')

ans =

hfPos = 520   378   560   420
haPos = 73.8000   47.2000  434.0000  342.3000

должен интерпретироваться так: this

Однако я понятия не имею, почему get(ha,'position') возвращает числа с плавающей запятой.

В моей системе (Win7 Pro, MATLAB R2016a, Java 1.7.0_60-b19) следующий код выдает предупреждение:

get(gcf,'JavaFrame');
Warning: figure JavaFrame property will be obsoleted in a future release. For more information see the JavaFrame resource on the MathWorks web site. 

Поэтому я бы не стал полагаться на его использование. Вместо этого я использовал бы информацию выше, чтобы получить размер и положение осей, нанесенных в MATLAB.