2015-11-05 2 views
1

Я пытаюсь создать текстовое поле, где размер шрифта изменяется после того, как поле будет заполнено или переполнено.Как определить, переполняется ли окно редактирования (графический интерфейс Matlab)?

Помимо установки типа шрифта на фиксированную ширину и подсчета количества символов, соответствующих размеру шрифта, вручную, есть ли автоматический/программный способ сделать это?

ответ

0

Я нашел решение:

Для статических текстовых полей можно использовать свойство «Степень» UI (http://www.mathworks.com/help/matlab/ref/uicontrol-properties.html#property_extent), чтобы получить нужный размер текстового поля.

Для окна редактирования это, к сожалению, возвращает текущий видимый размер, а не предпочтительный размер (Text 'Extent' property doesn't contain the correct size). Предпочтительный размер можно получить, вызвав вызовы java-интерфейса (компоненты Matlab - это просто (в основном?) Обернутые компоненты java swing). Используйте функцию findjobj (http://www.mathworks.com/matlabcentral/fileexchange/14317-findjobj-find-java-handles-of-matlab-graphic-objects), чтобы получить дескриптор java окна редактирования и получить предпочтительный размер поля.

Кода для достижения автоматического изменения размера шрифта (например, что максимальный размер шрифта, который по-прежнему соответствует всей строке используется):

% --- Executes on key press with focus on edit1 and none of its controls. 
function edit1_KeyPressFcn(hObject, eventdata, handles) 
% hObject handle to edit1 (see GCBO) 
% eventdata structure with the following fields (see MATLAB.UI.CONTROL.UICONTROL) 
% Key: name of the key that was pressed, in lower case 
% Character: character interpretation of the key(s) that was pressed 
% Modifier: name(s) of the modifier key(s) (i.e., control, shift) pressed 
% handles structure with handles and user data (see GUIDATA) 
H = hObject; 
position = get(H,'Position'); 
width = position(3); 
javaH = findjobj(H); 
for FontSize = 48:-2:12 
    javaH.setFont(javaH.getFont().deriveFont(FontSize)); 
    prefWidth = javaH.getPreferredSize.getWidth; 
    if prefWidth < width 
     break; % Escape loop: for FontSize 
    end 
end 

я использовал метод Java, чтобы изменить размер шрифта, как я заметил, что предпочтительный (с задержкой на 1 итерацию?) при использовании вызова Matlab (H, 'FontSize', FontSize).