文本“范围”属性不包含正确的大小

我想在GUI中放置一些文本,我想知道'text'types的uicontrol需要的确切大小!

我发现有几个线程解释说,这可以使用包含相同文本的'text'对象的'Extent'属性完成,请参阅示例:

 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)); 我看到下图窗口:

在这里输入图像说明

从图像中可以看到, textsizevariables中提取的文本的高度太小了!

请注意,这是我在运行Matlab R2014a的Windows计算机上运行程序时得到的结果。 我后来在运行Matlab R2013b的Linux机器上运行完全相同的代码,在那台机器上我得到了我想要的结果。

我所制作的graphics用户界面应该(希望)能够在任何计算机上运行,​​但是现在我对如何继续制作适用于任何机器的版本感到茫然,所以请帮助我!

编辑:我试图运行Matlab R2011b(而不是我的R2014a)运行相同的代码在另一台Windows 7机器(这次是最终版本,而不是我的企业版),它仍然产生错误的文本框高度 – 但这次文本框太高 – 看图:

在这里输入图像说明

编辑2:我终于装了R2014b,但可悲的是它没有帮助! 我有一个类似的图片:

在这里输入图像说明

我也试图看看屏幕分辨率的不同select是否有所不同 – 他们没有。

EDIT3:

我注意到不同的字体在高度上会产生不同的错误,例如默认字体(MS Sans Serif)会产生太高的文本框(并且随着更多的行被添加,这个高度错误也会增加) – 然而,在Linux得到了我尝试过的所有字体的正确结果。

但真正的情况下,我最感兴趣的是使用快递字体的情况下,因为我需要一个等宽字体为我的目的。

Solutions Collecting From Web of "文本“范围”属性不包含正确的大小"

观察事物的Java方面, Swing组件有几个有趣的方法:

  • getVisibleRect
  • getSize (从我的测试,它给与getVisibleRect类似的结果)
  • getPreferredSize

事情是,“首选大小”似乎是正确的大小(你所寻求的),而由get(...,'Extent');返回的大小get(...,'Extent');可见的大小,它有以下含义:

getVisibleRect()

返回组件的“可视矩形” – 此组件的可见矩形,新的Rectangle(0,0,getWidth(),getHeight())及其所有祖先的可见矩形的交集。

为了澄清以上内容:图形窗口的主题和特定于平台的装饰可能会减少组件的可用空间,从而减少可见大小(如此处所述)。

作为一个数值的例子,当使用默认设置和repmat('A',14) ,我得到(在Win7上,MATLAB 2015a):

  • get(u,'Extent')[0,0,116,214]
  • jHandle.getVisibleRectjava.awt.Rectangle[x=0,y=0,width=116,height=214]
  • jHandle.getSizejava.awt.Dimension[width=116,height=214]
  • jHandle.getPreferredSizejava.awt.Dimension[width=116,height=221]

现在的问题是如何获得PreferredSize (或jHandle可能jHandle )方便…

我使用的一个选项是findjobj实用程序,其用法与jHandle = findjobj(u)一样简单。

总结:

  1. findjobj放在你的工作文件夹中。
  2. 把你找到textsize的两行代替:

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

  3. 利润。

PS

我的推理可能是有缺陷的,对Swing的理解是不正确的,但是这个解释对我来说是有意义的,更重要的是 – 这是有效的。