我想在GUI中放置一些文字,我想知道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
变量中提取的文本的高度太小了!
请注意,这是我在运行Matlab R2014a的Windows计算机上运行程序时得到的结果。我后来在运行Matlab R2013b的Linux机器上运行完全相同的代码,在那台机器上我得到了我想要的结果。
我正在制作的GUI应该(希望)能够在任何计算机上运行,但是现在我真的不知道如何继续制作适用于任何机器的版本,所以请帮助我! / p>
修改 我试图在运行Matlab R2011b(而不是我的R2014a)的另一台Windows 7机器(这次是Ultimate版而不是我的企业版)上运行相同的代码,它仍然产生了错误的文本框高度 - 但这次是文本框太高了 - 见图片:
EDIT2: 我终于安装了R2014b,但遗憾的是它没有帮助! 我看到了类似的图片:
我还试图看看我的屏幕分辨率的不同选择是否有所不同 - 他们没有。
EDIT3:
我注意到不同的字体会在高度上产生不同的错误,例如:默认字体(MS Sans Serif)会产生一个太高的文本框(随着更多行的添加,这个高度错误也会增加) - 在Linux上我得到了我尝试的所有字体的正确结果。
但我最感兴趣的是使用信使字体的情况,因为我需要一个等宽字体。
答案 0 :(得分:1)
观察事物的Java方面,Swing组件有几种感兴趣的方法:
getVisibleRect
getSize
(从我的测试中,它给出了getVisibleRect
)getPreferredSize
问题是,“首选大小”似乎是正确的大小(您寻求的),而get(...,'Extent');
返回的大小是可见大小,其中包含以下含义:
getVisibleRect()
返回Component的“可见矩形” - 此组件的可见矩形,新Rectangle(0,0,getWidth(),getHeight())和其所有祖先的可见矩形的交集
为了澄清上述内容:图形窗口的主题和平台特定装饰可能会减少组件的可用空间,从而减小其可见大小(如上所述here)。
作为一个数字示例,当使用默认设置和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)
一样简单。
总结:
将textsize
替换为(?:prof|proforma|F|fact|PRO|factura)\s*\.?\s*(?:nr|numar)?\.?\s?:?\s?(\d+(?=(?:\d\d\.\d{2}\.\d{4})|\s*$|[a-z]+))
的两行:
v = findjobj(u); textsize = [v.getPreferredSize.getWidth v.getPreferredSize.getHeight];
PROFIT。
P.S。
我的推理可能存在缺陷,对Swing的理解不正确,但这种解释对我来说很有意义,更重要的是 - 它有效。