6

我想在 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 应该(希望)能够在任何计算机上运行,​​但现在我真的不知道如何继续制作适用于任何机器的版本,所以请帮助我!

编辑: 我尝试在另一台运行 Matlab R2011b(而不是我的 R2014a)的 Windows 7 机器(这次是 Ultimate 版而不是我的 Enterprise 版)上运行相同的代码,它仍然产生了错误的文本框高度 - 但这次文本框太高 - 见图片:

在此处输入图像描述

EDIT2: 我终于安装了 R2014b,但遗憾的是它没有帮助!我得到了一张类似的图片:

在此处输入图像描述

我还试图看看我的屏幕分辨率的不同选择是否有任何区别——它们没有。

编辑3:

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

但实际上我最感兴趣的情况是使用 courier 字体的情况,因为我需要一个等宽字体来达到我的目的。

4

1 回答 1

1

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

问题是,“首选尺寸”似乎是正确的尺寸(您寻求的),而返回的尺寸get(...,'Extent');可见尺寸,其含义如下:

getVisibleRect()

返回组件的“可见矩形” - 此组件的可见矩形、new 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); textsize = [v.getPreferredSize.getWidth v.getPreferredSize.getHeight];

  3. 利润。

附言

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

于 2015-05-25T16:59:39.567 回答