Свойство Text Extent не содержит правильный размер
Я хочу разместить текст в графическом интерфейсе и узнать точный размер uicontrol
типа 'text'
должно быть!
Я нашел несколько потоков, объясняющих, что это можно сделать с помощью 'Extent'
свойство 'text'
объект, содержащий тот же текст, см. пример:
function form = tempfunc(txt,font,fontsize)
if nargin <3
fontsize = 10;
end
if nargin < 2
font = 'courier';
end
f = figure('Visible','off','Units','pixels');
u = uicontrol(f,'Style','text','Units','pixels','String',txt,'FontName',font,'FontSize',fontsize);
textsize = get(u,'Extent');
textsize = textsize(3:4);
close(f);
form = figure('Units','pixels');
uicontrol(form,'Style','text','Units','pixels','String',txt,'FontName',font,'FontSize',fontsize,'Position',[5,5,textsize]);
end
Моя проблема сейчас в том, что это не работает. Когда я запускаю вышеупомянутое с tempfunc(repmat('A',14));
Я получаю следующее окно рисунка:
Как видно из изображения, высота текста, извлеченного в textsize
переменная слишком мала!
Обратите внимание, что это результат, который я получил, когда запустил программу на компьютере под управлением Windows, на котором запущен Matlab R2014a. Позже я запустил точно такой же код на Linux-машине с Matlab R2013b, и на этой машине я получил желаемый результат.
GUI, который я создаю, должен (надеюсь) работать на любом компьютере, но сейчас я действительно не знаю, как мне сделать версию, которая работает на любой машине, поэтому, пожалуйста, помогите мне!
РЕДАКТИРОВАТЬ: я пытался запустить тот же код на другом компьютере с Windows 7 (на этот раз Ultimate Edition вместо моей версии Enterprise) под управлением Matlab R2011b (вместо моего R2014a), он по-прежнему выдавал неверную высоту текстового поля - но на этот раз текстовое поле было слишком высоко - см. изображение:
EDIT2: я наконец-то установил R2014b, но, к сожалению, это не помогло! Я получил похожую картинку:
Я также пытался понять, имеют ли значение различные варианты разрешения моего экрана - нет.
EDIT3:
Я заметил, что разные шрифты приводят к разным ошибкам по высоте, например, шрифт по умолчанию (MS Sans Serif) выдает текстовое поле, которое слишком велико (и эта ошибка по высоте также увеличивается по мере добавления новых строк) - однако в Linux я получил правильный результат для всех шрифтов, которые я пробовал.
Но в действительности дело, которое меня больше всего интересует, - это использование шрифта courier, так как мне нужен моноширинный шрифт для моих целей.
1 ответ
Наблюдая за аспектами Java, компоненты Swing имеют несколько интересных методов:
getVisibleRect
getSize
(который, по моим тестам, дает сопоставимые результатыgetVisibleRect
)getPreferredSize
Дело в том, что "предпочтительный размер" кажется правильным (который вы ищете), тогда как размер, возвращаемый get(...,'Extent');
это видимый размер, который имеет следующее значение:
getVisibleRect ()
Возвращает "видимый прямоугольник" компонента - пересечение видимого прямоугольника этого компонента, нового Rectangle(0, 0, getWidth(), getHeight()) и видимых прямоугольников всех его предков.
Для пояснения вышесказанного: тематические и платформенные декорации окна рисунка могут уменьшить доступное пространство компонента и, следовательно, его видимый размер (как упомянуто здесь).
В качестве числового примера, при работе с настройками по умолчанию и repmat('A',14)
, Я получаю (на Win7, MATLAB 2015a):
get(u,'Extent')
-[0,0,116,214]
jHandle.getVisibleRect
-java.awt.Rectangle[x=0,y=0,width=116,height=214]
jHandle.getSize
-java.awt.Dimension[width=116,height=214]
jHandle.getPreferredSize
-java.awt.Dimension[width=116,height=221]
Теперь вопрос как получить PreferredSize
(или же jHandle
от которого его можно получить) удобно...
Одним из вариантов, который я использовал, является утилита findjobj, использование которой так же просто, как jHandle = findjobj(u)
,
Подвести итоги:
- Поместите findjobj в вашу рабочую папку.
Замените две строки, где вы найдете
textsize
этим:v = findjobj (u); textize = [v.getPreferredSize.getWidth v.getPreferredSize.getHeight];
ПРИБЫЛЬ.
PS
Мои рассуждения могут быть ошибочными и неправильное понимание Swing, однако это объяснение имеет смысл для меня и, что более важно, оно работает.