我想在 GUI 中放置一些文本,我想知道 'text' 类型的 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)); 运行上面的代码时,我得到下图窗口:
从图中可以看出,textsize 变量中提取的文本高度太小了!
请注意,这是我在运行 Matlab R2014a 的 Windows 计算机上运行该程序时得到的结果。后来,我在运行 Matlab R2013b 的 Linux 机器上运行了完全相同的代码,并在那台机器上得到了我想要的结果。
我正在制作的 GUI 应该(希望)能够在任何计算机上运行,但是现在我真的不知道应该如何制作一个可以在任何机器上运行的版本,所以请帮助我!
编辑: 我试图在另一台运行 Matlab R2011b(而不是我的 R2014a)的 Windows 7 机器(这次是终极版而不是我的企业版)上运行相同的代码,它仍然产生了错误的文本框高度 - 但这次是文本框太高了——看图片:
编辑 2: 我终于安装了 R2014b,但遗憾的是它没有帮助! 我有一张看起来很相似的图片:
我还尝试查看不同的屏幕分辨率选择是否有任何不同 - 它们没有。
编辑 3:
我注意到不同的字体会产生不同的高度错误,例如默认字体 (MS Sans Serif) 会产生一个太高的文本框(并且随着添加更多行,高度错误也会增加)- 但是在 Linux 上,我尝试的所有字体都得到了正确的结果。
但实际上我最感兴趣的是使用 courier 字体的情况,因为我需要等宽字体来实现我的目的。
最佳答案
观察事物的 Java 方面,Swing组件有几个有趣的方法:
getVisibleRect getSize (根据我的测试,它给出了与 getVisibleRect 相当的结果)getPreferredSize 问题是,“首选大小”似乎是正确的大小(您寻求的大小),而 get(...,'Extent'); 返回的大小是visible尺寸,含义如下:
getVisibleRect()
Returns the Component's "visible rectangle" - the intersection of this component's visible rectangle, new Rectangle(0, 0, getWidth(), getHeight()), and all of its ancestors' visible rectangles.
澄清以上内容:图形窗口的特定于主题和平台的装饰可能会减少组件的可用空间,从而减少其可见大小(如前所述 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 所在的两行替换为:
v = findjobj(u); textsize = [v.getPreferredSize.getWidth v.getPreferredSize.getHeight];
利润。
附言
我的推理可能有缺陷并且对 Swing 的理解不正确,但是这个解释对我来说很有意义,更重要的是 - 它有效。
关于windows - 文本 'Extent' 属性不包含正确的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28344265/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',