我試圖創建一個文本框,其中的字體調整大小一旦框中已滿或溢出。如何確定編輯框是否溢出(Matlab GUI)?
除了將字體類型設置爲固定寬度以及手動計算每個字體大小有多少字符適合以外,是否有自動/編程方式來執行此操作?
我試圖創建一個文本框,其中的字體調整大小一旦框中已滿或溢出。如何確定編輯框是否溢出(Matlab GUI)?
除了將字體類型設置爲固定寬度以及手動計算每個字體大小有多少字符適合以外,是否有自動/編程方式來執行此操作?
我找到了一個解決方案:
對於靜態文本框,一個可以用「程度」 UI屬性(http://www.mathworks.com/help/matlab/ref/uicontrol-properties.html#property_extent)來獲取文本框的首選大小。
對於編輯框,這不幸的是返回當前可見大小,而不是首選大小(Text 'Extent' property doesn't contain the correct size)。首選的大小可以通過調用Java UI調用來獲得(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方法來改變的字體大小作爲我注意到,優選的當使用Matlab集(H,'FontSize',FontSize)調用時,寬度調用會不正確(延遲1次迭代?)。