Свойство 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),

Подвести итоги:

  1. Поместите findjobj в вашу рабочую папку.
  2. Замените две строки, где вы найдете textsize этим:

    v = findjobj (u); textize = [v.getPreferredSize.getWidth v.getPreferredSize.getHeight];

  3. ПРИБЫЛЬ.

PS

Мои рассуждения могут быть ошибочными и неправильное понимание Swing, однако это объяснение имеет смысл для меня и, что более важно, оно работает.

Другие вопросы по тегам