图片缩略图"itemprop=

GUI布局工具箱

版本1.27.0.1 (646 KB) 本Tordoff
MATLAB gui的布局管理对象
4.9
134年评级

37下载

更新2016年9月1日

查看版本历史

查看许可协议

编者按:此文件被选为MATLAB Central本周精选

注:此版本适用于MATLAB R2014a及更早版本。如果您使用的是MATLAB R2014b或更高版本,请在这里使用新版本://www.tatmou.com/matlabcentral/fileexchange/47982-gui-layout-toolbox
此工具箱提供了创建复杂的MATLAB图形用户界面的工具,可以优雅地调整大小。所提供的类可以组合使用来生成几乎任何用户界面布局。
*水平、垂直或网格排列MATLAB用户界面组件
*能够混合固定尺寸和可变尺寸的元素
*通过拖动分隔线动态调整元素的大小
*使用面板和选项卡切换界面页面
文档包括在内,并集成到MATLAB帮助浏览器。它也可以被看作是一个独立的网页。

这些布局被设计为可扩展的。Matt Whitaker的ButtonGroups就是一个很好的例子:
//www.tatmou.com/matlabcentral/fileexchange/31902

这个工具箱是由MathWorks咨询小组的Ben Tordoff和David Sampson开发的。

引用作为

本·托多夫(2021)。GUI布局工具箱(//www.tatmou.com/matlabcentral/fileexchange/27758-gui-layout-toolbox), MATLAB中央文件交换。检索

意见及评分(337

衬管

这个条目需要在文件交换上更新到最新版本,因为像Kilosort2这样的程序依赖于最新版本:
//www.tatmou.com/matlabcentral/fileexchange/47982-gui-layout-toolbox

严厉的

Leul Belayneh

类“uiextras”未定义。
也许Java没有运行。
为什么上面的错误文本弹出时,我运行的工具箱?

开明冯

杰克·斯宾塞

我找到了一个工作周围的工作与应用程序打包工具,GUI布局工具箱需要卸载,然后应用程序可以打包,然后GUI布局工具箱需要重新安装,以便应用程序将工作。

bawa swafiyudeen

你好。我不太会用MATLAB。我使用MATLAB 2015a(UBUNTU 14.04),我需要GUI,这样我就可以使用一个叫做GITSA的软件。请指导我如何安装使其激活

杰克·斯宾塞

这个工具箱与R2013a中的App打包和安装工具一起使用吗?

Kekse_Monster_321

我刚刚找到了一个解决方案:似乎是,如果在GUI上有太多的ui控件,它需要大量的计算来调整大小。即使大多数元素是不可见的,例如,如果它们在当前未选中的选项卡上,这些元素也必须计算调整大小(或其他事情?)我的解决方案是有一个“create_page”-函数为我的每个选项卡。在这个函数中,我为所选选项卡创建了所有元素。此外,我还删除了未选中选项卡上的所有元素。这很有帮助。总结一下:感谢这个工具箱,因为没有它,甚至不可能有这么复杂的GUI!

Kekse_Monster_321

起初,它似乎是一个非常有用的工具,但随着我的GUI变得越来越复杂,我在调整大小时遇到了问题。但也许我正在做一些完全错误的事情。
我拥有的:GUI包含大约500个ui控件(如标签,编辑框,滑块等),分布在一个TabPanel的4个不同的选项卡上,甚至一些子TabPanel…这是很多,但这是这个任务所需要的。
当我手动调整GUI大小时发生了什么:它需要大约4秒来完成调整大小。最烦人的部分是,我可以看到每个单独的元素被重绘多次。
应该发生什么:如果有一些计算和重新定位是绝对需要的,它不应该是可见的,因为用户会对它感到困惑。
我可以用不同的Matlab版本(2010b到2014a)以及不同的渲染设置来重现这一点。
什么会有所帮助:是否有可能关闭所有控件的可见性,直到调整大小完成?如果是,怎么做?非常感谢!

大卫·桑普森

不支持保存和加载GLT对象。金宝appMATLAB基础结构中存在一些空白,使其目前难以实现。

相关的,有一些关于如何在GUIDE gui中包含GLT容器的文档。然而,在这种情况下,GLT容器不会保存在图文件中。

让玛丽

美妙的工具箱。我要用你的替换掉我自己的那种uiextra。有一个不方便的地方,包含uiextras的图形可以保存(作为.fig文件),但当人们试图打开它们时,Matlab崩溃了。下面的代码演示了这个问题:

纯Matlab:工作完美

图;
次要情节(2,1,1);
情节(rand (100,1));网格
次要情节(2,1,2);
情节(rand (100,1));网格
savefig(图,“D: \ Temp \ TestFig1.fig”)
关闭(图)
openfig(“D: \ Temp \ TestFig1.fig”)

使用uiextras:在试图打开.fig文件时引发Matlab崩溃

图;
verticalBox = uiextras。VBox(“父”,图);
hPanel = uipanel('Parent', verticalBox);
轴(“父”,hPanel);
情节(rand (100,1));网格
hPanel = uipanel('Parent', verticalBox);
轴(“父”,hPanel);
情节(rand (100,1));网格
savefig(图,“D: \ Temp \ TestFig2.fig”)
关闭(图)
openfig('D:\Temp\TestFig2.fig') %小心,Matlab会崩溃

好吧,一个好的跨越多个网格单元的组件的语法是这样的

gridHandle.layout (uiHandle行宽,colSpan);

其中rowSpan和colSpan可以是向量。然后,您的绿灰色网格示例中的东北元素将被定位为

gridHandle。布局(uiHandle, 1, 2:3)

我真的希望有这个功能,我认为布局更清晰,更容易被混淆,如果实际的布局安排是分开的uicontrol实例化。

琪琪

嗨,首先:我喜欢这个工具箱!非常感谢您的帮助!

但我确实有一个问题:我主要使用这个工具箱来使用选项卡。我的工具由几个tabpanel组成,每个选项卡都可以访问不同的分析方法,可以用来处理数据集,并在面板上的轴上绘制结果。我的问题是,当我使用属性<'标记','。'>在plot3D的情节和其他情节在同一面板上保持可见时,我点击到另一个TabPanel。当我不使用这个性质时,这不会发生,但所有的点都与线相连,这是我不想要的。

有人知道为什么轴的可见性会随着“Marker”属性的使用而改变吗?

-当我点击另一个选项卡时,图形仍然可见的代码:
cellfun (@ (x, y) plot3 (handlePanel x (: 1) x (:, 2), x(:, 3),“颜色”,colorcodes (y):),“标记”,“。”,“线型”,“没有”,“MarkerSize”,8),坐标,num2cell(1:长度(坐标)))

-当我点击另一个选项卡时,图形不可见时编码(期望的行为)
cellfun (@ (x, y) plot3 (handlePanel x (: 1) x (:, 2), x(:, 3),“颜色”,colorcodes (y,:), MarkerSize, 8),坐标,num2cell(1:长度(坐标)))

马克Shein-Idelson

很棒的工具箱,对于创建gui非常有用

大卫·巴里

神奇的

Verma Arti

大卫·桑普森

卡德尔,把你的HBoxes放到CardPanel里。

这是一个非常强大的工具箱。
关于一个有趣的应用程序,我想切换Hbox的可见性。

我该怎么做呢?

我有一个主要功能:main1
和onClick函数:onClick

小说的功能
f =图;
hbox1 = uiextras.HBox(“父”,f);
a1 =轴(“父”,hbox1);
hbox2 = uiextras。HBox('Parent',f,'Visible', 'on' );
a2 =轴(“父”,hbox2);
矩形(“父”,a2,“位置”,[1 1 1 1],“FaceColor”,“b”);
uicontrol('Parent', f, 'String', 'Button 1','Callback', @onClick);

函数onClick(hbox1,hbox2, ~)
status = get(hbox1,'Visible');
如果比较字符串(地位,“上”)
集(hbox1,“可见”,“关闭”);
集(hbox2,“可见”,“上”);
其他的
集(hbox1,“可见”,“上”);
集(hbox2,“可见”,“关闭”);
结束

日本胜利公司

为多次发帖道歉-我很难提交这条评论…

我在重新加载使用下面所示的代码片段保存的数字时遇到了一个严重的错误:

Hfig =数字;
vb = uix.HBox('Parent',hfig);
ctr = uicontainer('Parent',vb);

当这段代码生成的图形被保存到磁盘并重新加载时,会导致MATLAB立即硬崩溃(R2014B, 32位或64位,GUI Layout v2.1, Win7)。

有人遇到过这个问题或者知道如何解决它吗?

日本胜利公司

更正:我在前一篇文章中包含的代码片段有一个拼写错误-这是生成错误的正确代码。
荷兰国际集团(ing)代码:

Hfig =数字;
vb = uix.HBox('Parent',hfig);
ctr = uicontainer('Parent',vb);

理查德。

@Nicholas
如果你改变

ax = axes('Parent',box');

ax = axes('Parent',uicontainer('Parent', box));

这可能会解决你的问题。

当你在GUI布局工具箱中为一个轴指定父轴时,它必须在uicontainer中才能正常工作。

Hoo小便

对不起,如果这已经覆盖之前。我如何触发我自己的回调后,一个选项卡已被选中?我需要在回调中使用selectedChild属性,但现在它总是较早选择选项卡的索引,这是不好的。

在使用GUIDE之后使用这个工具箱绝对是一种乐趣。

尼古拉斯•王

2014年,传奇似乎被打破了。
这组命令在2014a中似乎有效,但在2014b中,轴的大小被调整为只占一半的空间。就好像下面有个看不见的东西。
如果我使用BoxPanel或Panel,轴就会消失。它似乎显著地改变了轴的“位置”,但我不确定还有什么。

F =数字;
box = uiextras.VBox('Parent',f);
ax = axes('Parent',box');
plH = plot(ax,rand(5,1),rand(5,1);
% % % % %
传说显示

扎基

优秀的代码,但是有人成功实现了良好的可滚动面板吗?

我尝试了下面Nicholas的代码,但它崩溃了,因为嵌套函数不能访问父工作空间。

Lehtym

你好,

非常感谢你给我这么好的工作!

然而,我发现这个包在某种程度上与标准的Matlab guihandles函数冲突。即以下代码产生误差(Matlab 2008b):

uiextras.Empty(“标签”,“空”);
H = guhandles;
???类没有适当的方法、属性或字段Instance
uiextras.Empty。

错误==> guhandles >createHandles在111
handles.(tag) = [prev_h control.Instance];

错误==> guhandles在75
handles = createHandles(fig);

这似乎来自于在uiextras中使用“Control”appdata的事实。Empty不同于它在Matlab图形内部的其他地方的使用。

使用更独特的appdata名称(如“GLT_Control”)来避免此类冲突不是更好吗?

保罗丰特

更正之前的帖子:sliderPanel将工作。

例子:

数字
h = uiextras。网格('Parent', gcf)
sliderPanel (h)
uiextras。空( 'Parent', h);
uiextras。空( 'Parent', h);
uiextras。空( 'Parent', h);
集(h, ColumnSizes,(120 1),“RowSizes”,[1]50);

保罗丰特

非常好!
不幸的是,无法找到一个兼容的多幻灯片(滑块+链接文本框)实现。

弗洛里安

嗨,好工具,但我得到一个错误:

"使用uiextras出错。MousePointerHandler/onMouseMoved
不能在类中访问方法“onMouseMoved”
“uiextras.MousePointerHandler”。

错误
uiextras.MousePointerHandler > @(变长度输入宗量)obj.onMouseMoved变长度输入宗量({}):
(48)行
集(无花果、“WindowButtonMotionFcn”、
@obj.onMouseMoved);

计算图形WindowButtonMotionFcn时出错"

而我做一些图形处理在循环一次,我悬停在我的GUI

恋人Ponudurai

我引用了Gui布局工具箱1.11版本的“资源”文件夹。将其更改为1.17,现在工作正常。

恋人Ponudurai

你好,

我得到以下错误启动任何编译。exe Matlab应用程序使用最新的GuiLayoutToolbox:

“大小的财产“大小”必须匹配大小的财产“儿童”

它只发生在Matlab 2013b中,在Matlab 2012b和更早的版本中工作得很好。

请建议。谢谢。

Sohil

伟大的工作!一个问题:我如何创建垂直标签?
我用的是uiextras。VBox来create vertical label but the Tabs stay horizontal.
先谢谢你。

mljli

@Harry同样的问题。只需注释“obj.”行即可。面板中的redraw()中的showSelectedChild"。M,这是可行的。

mljli

Juliane

你好,伟大的工具箱!
我想知道如何从对象中删除子对象(例如删除标签面板)?任何建议吗?非常感谢!

伊恩

丹·K

你好,
只是想知道,现在R2014b已经上线,我们什么时候可以期待工具箱的更新?有什么预计的时间吗?

谢谢,

卡斯帕

@Ian菲利普斯
哦,对不起。我没有看到其他帖子。
它是否与绘图属性有关?如果一个伟大的情节与喜欢:
情节(data.axesHandles_small {}, ECG.cabrera(:,我),“同意”,“线宽”,1)
然后是'。K '将导致标签中的所有其他图形,通过标签层进行跟踪。如果我使用'k' -从而跳过'。——一切正常。

伊恩•菲利普斯

@Kasper
是的,我看到了这个问题,请参阅我2013年11月12日的评论。
在UIPanel中绘图改善了这种情况,但并没有完全解决它。
这可能也与2014年9月8日下面@Stephanie的问题有关。我还没有尝试过调查这个解决方案,如果你想出了一个解决方案,请发帖。

卡斯帕

在除第一个制表符以外的制表符上使用plot3绘图,将导致绘图中的线条在制表符之前使用plot3“跟踪”回制表符。如果plot3有一个TabPanel作为父元素,它就可以正常工作,但是如果plot3有一个HBox作为父元素,它就不行了。

还有谁有这个问题或者解决办法吗?

卡斯帕

卡斯帕

公民疯了

我昨天提交的故障问题终于链接到opengl渲染器…所以没有问题…

奥兰

是否可以水平而不是垂直地向网格添加元素?
此外,使用分析器,我看到很多调用重绘函数。你不能在某些情况下跳过重画(当对象不可见时)

公民疯了

非常感谢这个工具箱,

在matlab R2013b中使用1.17版本,我遇到了一些CardPanel对象的显示问题。当从一张卡片切换到另一张卡片时,卡片中的坐标轴不能正确刷新,并且绘制或调整图形大小都没有帮助。你可以阅读更多的细节,并在stackoverflow上找到简单的测试用例:http://stackoverflow.com/q/25727765/684399

PS:这个工具箱对于设计有吸引力的界面非常有用。

伊戈尔

我刚刚在“2014年3月04日”版本中又发现了一个美容问题:“dockexample”中的第35、36、37行。M”似乎是不必要的——它们只是重复了第16、19、22行。

丹·K

威廉,
如果您像我一样使用命令行进行编译,请参阅Andreas在2014年5月30日给我的关于如何在命令行中包含它的提示。

大卫·桑普森

William,错误消息表明您没有在部署的应用程序中包含相关的映像文件。GUI布局工具箱文档包含了如何做到这一点的解释。

威廉

嗨,丹

谢谢你的帮助。我照你说的做了。运行depoled *.exe时出现如下错误:

D: \ \代码? ?错误使用==> imread在374
文件
“C: \用户当地\ Temp \ DPY \ AppData \ \ DPY \ mcrCache7.15 \ Quadru1 \工具箱\ guilayout-v1p17 \ + uiextras \ \ tab_NoEdge_Selected.png资源”
不存在。

错误==> TabPanel>iLoadIcon在429

错误==> TabPanel>TabPanel。在393重新加载图像

错误==>TabPanel>TabPanel。TabPanel在70

错误==>四polemachining >createInterfae在190

错误==>四polemachining在4

MATLAB: imread:应用程序

你知道造成这种错误的可能原因吗?

非常感谢。
威廉

赛斯肯纳

巴拉

谢谢你的工具箱!

一些成员提到了将他们现有的GUIDE布局与该工具集成在一起的问题。我找到了一个变通办法。

我不能重新父现有的对象(面板或表)到这个布局。但是,您可以在HBox中创建一个新的GUIDE面板,并且可以将现有面板中的每个项重新父化到这个新面板中,然后删除旧面板。

例子:

new_HBox = uiextras.HBox;

new_GUIDE_panel = uipanel('Parent',new_HBox,'BorderType','none');

children = get(old_GUIDE_panel,' children ');

集(孩子,‘父’,new_GUIDE_panel)

删除(old_GUIDE_panel)

只要你原来的和新的面板大小相等,所有的对象都将在新创建的面板中按预期的位置放置。

丹·K

William,这个建议并不是针对GLT的,但是如果你打开一个命令窗口并从那里启动可执行文件,你将能够看到抛出了什么错误导致程序崩溃。

威廉

你好,
我正在使用布局工具箱。这真的是一个很棒的工具。

我在使用MATLAB部署工具函数将开发的GUI部署到*.exe文件时遇到了一个问题。开发的GUI可以转换为*.exe文件,但当启动*.exe文件时,它会迅速出现并立即被windows关闭。我试过demoBrowser。M例中,同样的错误出现。顺便说一句,我在32位Windows 7操作系统上使用它。

知道这是为什么吗?

谢谢
威廉

Dom

你好,
我也在使用Matlab布局工具箱,很好的工具,恭喜:)。
我感兴趣的一件事是,削减我的应用程序,如果我用这个工具箱和一个uipanel创建了一个图形,在uipanel中我想创建一个轴,所以它应该看起来像这样:

...
figure_handle = figure('Position',[(screensize(3)-1100)/2 (screensize(4)-600)/2-20…
1100 600],'NumberTitle','off','Name','Test1','ResizeFcn',@ResizeFcnCB, 'HandleVisibility','off','CloseRequestFcn',@CloseRequestFcnCB,'Renderer','OpenGL','PaperPositionMode','auto');

handle_uipanel = uipanel('Parent',figure_handle);
handle_axes = axes('Parent',handle_uipanel);

所以,然后有一个轴,但没有一个盒子,我知道命令框上,我试图设置它:

盒(handle_axes、“上”)

但我只能在坐标轴的上面和右边看到两个lin。但我想看到一个完整的盒子,上下左右都有线条。

如果我创建一个数字和绘图到不使用工具箱,它的工作。
任何想法?
谢谢
Dom

最近在这个论坛上有一些关于GUI布局工具箱和R2014b的讨论,因为在那个版本中MATLAB图形将有重大的变化。
*当前公开发布的GUI布局工具箱与R2014b不兼容。
*我们将在产品发布时在MATLAB Central上发布r2014b兼容版本的GUI布局工具箱。
* R2014b的测试版目前正在测试中。如果您在R2014b预发布期间需要访问,请通过电子邮件与Ben和我联系,并简要描述您的需求。

伊恩

@jvc:我不能代表Ben和David说话,但是GLT的代码考虑到了新的HG2图形系统(只是还没有修复它的错误),所以我很确定他们打算更新。当然,一些来自本或大卫的官方消息将非常受欢迎!!

日本胜利公司

我加入了那些问这个工具箱是否会更新以兼容新的2014b图形系统的人的行列。我已经广泛地使用了我的日常数据处理工具工具箱-重建这些没有GUI布局将是一个巨大的工作。

即使答案是作者不打算更新工具箱,了解这一点对于规划目的也是有价值的。

大卫

谢谢你的工具箱!

我想用编译器(R2013b)编译我的应用程序,但.p文件有一个问题。是否可以将扩展名为。m的相同文件发送给我们?这两个文件在“Patch”目录下。谢谢!

尼古拉斯Jaccard

Sven:一开始我也认为更新“句柄”。Listener”到addlistener()调用可以达到目的。然而,实际情况似乎要复杂得多。由于GUI元素现在是对象,似乎工具箱的整个体系结构都必须重新工作。我希望这是一个权宜之计,但看来我们得等本告诉我们他们的最新计划了。

我同意这个工具箱应该更新以支持R2014b。金宝app我也愿意以任何方式提供帮助。

我和Sven和Ian一起询问工具箱是否会更新到与2014b兼容。我已经广泛地使用了它,为了继续使用而不更新MATLAB将是一种耻辱。我很乐意尽我所能帮助你!

斯文

是的,我同意伊恩的观点。我有相当多的接口,我想检查2014b的合规性,但他们都包装在uiextras容器内,目前错误的2014b预发布。我认为主要问题是“handle”的7个实例。需要在Container.m中更新为addlistener()调用。

伊恩

这将是非常有帮助的,如果这可以更新与新的预发布工作,我们可以在正式发布之前测试我们的gui !

安德烈亚斯

丹·K

我使用编译器选项-a,后面跟着Resources目录的路径。

例如:-a GUILayout\+uiextras\Resources

丹·K

我不知道其他人是否也是如此,但在当前的1.14版本中,我无法编译使用标签面板的GUI。它失败了,因为它无法在Resources目录中找到png文件,并且因为它是一个包,我不能使用-I来包含该目录。有什么建议吗?

布莱恩

米凯尔

干得好,谢谢
我唯一缺少的是定义一个不缩放内容的区域的可能性。
假设我设计了一个有两个字段的VBox。其中一个字段包含另一个VBox,每个字段中都有表行。这个VBox可以包含多达一百行,所以我希望他们有一个最小大小和滚动滑块,如果第二个VBox的总大小变得太大,第一个VBox自动添加。我猜MinimumSize属性应该修复这个问题,但它似乎不工作(或者可能我使用它的错误方式)

伟大的工具箱!我喜欢使用这个免费工具箱开发GUI是多么容易!

哈利

也谨代表我向你表示感谢。良好的文档工具箱,易于使用。但有一件事:在面板中,子情节会被覆盖(只显示最后一个)。有什么解决办法吗?

哈利

Hannu K

谢谢你的工具箱!

当我在gui中打开matlabpool并使用parfor时,我使用我的gui使用并行工具箱,我得到以下警告:

警告:com.mathworks.hg.peer。HG1FigurePeer@36300ca7是不可序列化的
java.io.InvalidClassException:
com.mathworks.hg.peer.FigureFrameProxy FigureFrame美元;
com.mathworks.hg.peer.FigureFrameProxy FigureFrame美元;没有有效的构造函数/n

警告:在执行“uiextras”时捕捉到以下错误。容器的
类析构函数:
||和&&操作符的操作数必须转换为逻辑标量
值。
>在remoteParallelFunction中的49

我应该担心吗?或者我可以压抑这些警告吗?不过,一切似乎都很正常。

大卫·巴里

达尼

我想把我的uiextras联系起来。面板with a window that displays some help text. I struggle to find a way how this can be done. I guess I could add this as a child to the panel, but since all panels look differently it is difficult to come up with a homogeneous way of doing this.

最简单的方法是向面板的标题添加一个回调,或者更优雅的方法是在面板顶部的右侧添加一个带有问号的按钮,即在标题文本的对面,该按钮具有对帮助窗口的回调。这些可能吗?

Thanakorn

Thanakorn

对不起,我找不到10颗星的按钮,所以你只需要得到5颗星。做得好,谢谢你:)

我刚刚开始使用这个工具箱,我终于可以构建好看的和功能的MATLAB gui。谢谢你做的所有工作。

马丁

当我试图从文件中加载一个具有uiextras字段的结构时,我得到警告消息,因为删除fcn被称为where obj。UIContainer返回空。我认为你需要先检查obj是否有这个字段。

本Tordoff

嗨,Emmanuel,当你运行“install”(从MATLAB内部或外部)时,它会尝试更新MATLAB的路径。这需要对安装MATLAB的位置具有写权限。如果您没有权限更新MATLAB的路径,最好的方法是在使用工具箱之前在MATLAB中运行“install”。如果希望工具箱始终可用,请将此调用添加到您的个人startupm。

我知道这有点痛苦,但我认为没有别的办法。

阿弗洛

当我试图运行install.bat时,出现一个对话框,提示“无法保存路径,重新启动MATLAB时需要重新安装”。我该如何解决这个问题?或者我该怎么用这个?抱歉问了这么愚蠢的问题。我只是说要用Matlab。谢谢!

马丁

似乎是一套有用的工具。

那么如何正确拼写hierarchy呢?

伊恩

Ben,你打算在HG2正式发布之前支持它金宝app吗,因为目前我想确保我的GUI在正式发布之前都能与即将到来的HG2一起工作,但我无法测试任何使用GUI布局工具箱的东西(我所有的其他GUI都与HG2一起工作)…

穆莱雅

了不起的工作!

1月

哦,天哪……

我有时候有点笨。

没关系,回调是有效的。

1月

谢谢这个有用的工具箱!

我在使用TabPanel时遇到了一个问题。我知道有可能添加一个SelectionChange回调。我又加了一条:
set(tabPanel, 'Callback', @test);

功能测试(变长度输入宗量)
disp(测试);
% fcn结束

然后我得到以下错误:
没有为类uiextras.TabPanel找到带有匹配签名的方法'disp'。

如何建立自己的回调函数?(我想另一个面板被改变,当标签被改变)。

再次表示敬意和感谢。
1月

关于我之前提到的关于应用程序部署的“bug”。解决方案是在编译期间手动将资源文件添加到所需文件列表中。

关于依赖步行者生成的警告-我还没有发现任何影响,sp它可能被忽略(即我没有观察到它需要任何依赖检查器没有发现的函数)。

干得好——保持更新。

这是MATLAB软件的一个极好的例子,它给了我一个在我自己的工作中努力的模型。我经常用这个。它非常灵活和可靠,代码激励我充分利用MATLAB内置的面向对象结构。

伊戈尔

嗨,硅,
你读过“patch”文件夹里的“readme.txt”文件了吗?你说的p-file就在这里。
这主要解释了他们为什么会在那里。

看起来这些文件是核心matlab函数的固定版本,所以开发人员不会发布它们的源代码。只希望这些问题会在某个时候被消除。

本•沙利文

它很容易使用,但是,当我试图将这个GUI编译成独立的应用程序时,我一直面临着同样的问题。

当尝试编译某些代码时,会给出相对于缺少相关m -file的p -file的警告。

这里有一个例子:

警告:需求不能分析P-code,除非用户提供了与P-code相对应的M-code
相同的文件夹中。D:\Codes\MATLAB\GUILayout-v1p14\Patch\getpixelpositionP可能不包括在
完成,因为它对应的m代码不能被REQUIREMENTS找到。

我想知道有没有什么变通办法,或者你能不能把m码放出来。因为编写gui的主要原因是通过独立的项目来分发它。提前谢谢你的帮助。

亚当·怀亚特

有一个小“错误”,使此包与Matlab“应用程序编译器”应用程序不兼容,用于重新分发已编译的独立应用程序。

解决方法如下:

问题在于使用“fileparts”将图像位置硬链接到包的位置。我用“isdeployed”的测试替换了这些行,例如uiextras的第424/5行。TabPanel (iLoadIcon函数):
如果~ isdeployed
This_dir = fileparts(mfilename('fullpath'));
icon_dir = fullfile(this_dir, 'Resources');
其他的
This_dir = '.';
Icon_dir = '.';
结束

然后,我简单地将资源文件包含在应用程序中的其他文件列表中。

亚当·怀亚特

伊恩•菲利普斯

在不同的选项卡中绘制图形的好方法。强烈推荐。

注意:有一个小错误,来自不同标签的图形被绘制在彼此的顶部。这个问题可以用uipanel来解决(而不是uicontainer)。请看下面来自@eff和@Brett 2013年8月22日的评论。

Sebastien杜兰

当尝试编译某些代码时,会给出相对于缺少相关m -file的p -file的警告。

你能修好这个吗?

这里有一个例子:

警告:需求不能分析P-code,除非用户提供了与P-code相对应的M-code
相同的文件夹中。D:\Travail\Codes\MATLAB\GUILayout-v1p14\Patch\getpixelpositionP可能不包括在
完成,因为它对应的m代码不能被REQUIREMENTS找到。

杰克逊理查兹

伟大的工具!

只是关于尺寸的问题…

是否有一种“自动”/智能的方法来调整父元素的大小,其中所有的子元素都有固定的像素大小?ie。在一个有2个100像素高度的面板的图形中的一个VBox。有没有办法自动设置图形高度为2*100+2*填充+1*间距?

干杯

蒂莫西

罗杰GALLOU

Sven指出的操作纠正了这个问题。
抱歉之前的评级GUILayout工具箱。这是我的失误。GUILayout工具箱是一个非常好的贡献。

斯文

@罗杰和其他在升级到2013b时突然启动MATLAB冻结的人:你一直遇到的问题现在已经解决了。您需要按照错误报告968648 (//www.tatmou.com/金宝appsupport/bugreports并搜索968648)。

Roger,我同意这是一个非常令人沮丧的错误,但我不认为这是GUI布局工具箱的问题-更可能是MATLAB启动错误。

罗杰GALLOU

罗杰GALLOU

你好,

贡献巨大的GUILayoutToolbox 1.13版本与Matlab R2013b版本存在不兼容问题。
我们将默认文件installGuiLayoutToolbox设置为StartUp。不幸的是,它也阻塞了我们的MatLab R2013b。经过分析,我们在文件目录layoutHelp GUILayoutToolbox中注释了工具箱 online info.xml。也许在那里,他通过我们的工具箱有一个解释:信号处理,映射工具箱,图像处理。
如果这条信息能帮助别人,那就更好了……

本Tordoff

appdata遇到问题的,请更新到最新版本。根据发布说明,这个问题应该已经解决了。如果你发现它仍然不起作用,请告诉我。

安德烈亚斯

嗨,本,嗨,大卫。谢谢分享这个非常有用的工具。

我遇到了mousepointerhandler类的问题(Linux, R2011a):
如果我在一个图形中为一个坐标轴对象注册了一个新的指针,这个坐标轴的位置是不正确的。我可以通过在mousepointerhandler类def中的第120行中将引用图句柄从0更改为fight来解决这个问题。

亚尼克

你好,

只是在重复我自己的观点,但我看到它没有在最新的更新中修复…

为了不让折叠框面板的子面板显示在GUI的其余部分,您需要将Container的第368行更改为第371行。M致:

如果位置(3)<=0 ||位置(4)<=0
空间不够,移到屏幕外。%
位置= [-10000 -10000 10 10];
结束

本Tordoff

谢谢Igor,我已经为下一个版本修复了这个问题。

伊戈尔

非常好的工具,谢谢。

我在文档页上发现了一个小错误
函数% 20 reference2_6.html
使用Images/bigicon_HButtonBox.png图像代替
图片/ bigicon_VButtonBox.png

海因里希

献给所有有同样问题的人
是一个快速而肮脏的解决方案:(如果可以的话?)

====================================
函数userDataReturn = uiextrasUserData(uiextrasObj, userData)
%获取/设置userData为uiextras-Objects

userDataReturn = [];

查找根目录下的所有对象
allObjs = findobj(0);

% Iterieren und nach dem对象suchen, dessen“容器”-appdata
% dem übergebenen objeckt entspricht
for curObj = allObjs'

试一试
ad = getappdata(curObj, 'Container');

if uiextrasObj == ad

如果nargin < 2
userDataReturn = get(curObj, 'UserData');
返回
其他的
set(curObj, 'UserData', UserData)
返回
%如果结束

%如果结束

捕获%无捕获
结束

%——结束

% fcn结束
=======================================

海因里希

我几乎不怀念UserData和AppData,
有时这是唯一的地方
您可以在最佳实践中存储数据
oo编程。

但你做得太好了!

斯文

啊哈!是的,帕特里克发现了我所得到的幻影错误。uiextras。TabPanelwas the object not working in 2013b pre-release.

Ozan它

你好再次,

我有一个GUI使用这个工具。
有一些控件和一个日志图……

为了能够打印这个情节,我将它复制到一个新的人物,以及它的图例。

如果我不触摸GUI,打印功能似乎工作得很好,但是,如果我滑动分隔符(在绘图区域和控制区域之间),图例没有正确复制,这样图例变得巨大,并在屏幕上定位错误。

问题似乎是在前面提到的GUI改变后,图例的位置值混合。见下文:

我使用这个代码:
getpixelposition (axis_on_the_main_screen(1),真的)

修改前的值为:

legend_position =
897.8333 570.5000 116.0000 23.3333

更改GUI后的值相同:

legend_position =
23 18 993 575

Ozan它

你好,

我有一个GUI使用您的工具。
我还使用export_fig工具打印图。

发送“print”命令后,GUI更改:uiextras。空objects disappear and legend becomes uneditable.

我只是想告诉你。

布雷特

@eff
我在布局中的不同选项卡中使用了几个轴。我还需要能够进行阴谋类型的绘图。我的解决办法是把所有的轴都放在一个uipanel中。这样uipanel就充当了坐标轴的容器。这也允许面板有多个重叠的子面板,而不用uitab的布局将它们分离到它的布局中。

下面几行

h1 = uiextras.TabPanel('Parent',figure);
h2 = uiextras.VBox('Parent',h1);
集(h1,“使”,“上”);

在R2013a中正常工作,但在R2013b预发布中产生错误:

使用isappdata出错
uiextras。VBoxobject does not support application data."
...

斯文

哈,我似乎不能重现我得到的错误:)
这是我第一次看2013b,所以怀疑它要么是一个小妖精在重启时跑掉了,要么是一个完全不同的错误,我只是指责在新的beta;)
如果再出现,我就发邮件告诉你条件。

大卫·桑普森

Sven,没有计划弃用getappdata和setappdata。如果您在R2013b预发布版中发现了问题,请直接与本和我或在这个论坛上分享复制步骤。

斯文

@Ben,
只是一个提示,2013b预发布已经停止了getappdata/setappdata方法,这导致一些崩溃的uiextras组件。您是否计划在其他地方存储数字回调?

杰米大杯

讨厌跟进我自己的帖子,但为了记录,这似乎不是一个次要情节的问题-这个版本使用uiExtras。网格也有类似的功能。它做了一些调整,以真正强调这个问题(在右边的网格框中从来没有绘制过任何东西,但它仍然积累了所有的绘图点:

Clist = 'rgbmy';
Tabpanel = uiextras。TabPanel('Parent', gcf);
为n = 1:4
Uip = uiextras。网格('Parent', tabpanel);
轴(“父”,摘要);
X = 1:2;Y = x+n;
集(情节(x, y,“o”)、“markerfacecolor”,clist (n));
yrange (0, 10);
轴(“父”,摘要);
结束
tabpanel。选择edChild = 1;

在好的方面,我想我可以包括一个假图来吸收所有的错误,让n-1子图正确:-)

杰米大杯

问个小问题——是否可以将用户特效和次要情节混合在一起?乍一看,它看起来很合理,但下面是一段简短的代码片段:

Tabpanel = uiextras。TabPanel('Parent', gcf);
为n = 1:4
uip = uipanel('Parent', tabpanel);
subplot(1,1,1, 'Parent', uip)
X = 1:2;Y = rand(size(x));
Plot (x, y, '-o');
结束
tabpanel。选择edChild = 1;

这将生成一些标签,每个标签都有一个图。第一个选项卡累积所有4个图,第二个选项卡最后3个,等等。我猜答案是:不要把次要情节和用户界面附加元素混在一起,但在文档中并没有明确的规定。将子图切换到网格将意味着大量的重新编码,所以我想在我决定是否值得之前,最好知道这是一个bug还是一个功能(仅供参考-这不会发生在hist!)

马克

@sven和Ben:真有趣,我今天在我目前的项目中遇到了完全相同的问题(也是因为你的图标和思考次要情节)。我只能鼓励你尝试并重新实施“跨越多个网格”问题。我认为它可以方便许多实际的GUI应用程序或布局。无论如何,感谢您在Thuns工具箱中的出色工作!

斯文

谢谢你的澄清。跨多个网格条目的能力将非常有用。另一方面,定义它的语法……我同意——混乱。我对网格一直不太适应。子元素用法(比如将子元素重新排列成不同于列的特定顺序——先左至右)。我欢迎你再来,也很乐意给你反馈。

斯文

@Beat:

我认为你用Container.getpixelposition击中了一个缺失的功能。它还没有递归实现(然而常规的MATLAB ui组件有,一些java组件调用递归版本)。你可以通过替换我下面得到的函数来得到,但我仍然有一两个问题。本,大卫,这合理吗?

函数pos = getpixelposition(obj,递归)
获取像素的绝对位置

% POS = GETPIXELPOSITION(C)获取容器C的绝对位置
%在其父窗口内。返回的位置以像素为单位。
Pos = getpixelposition(obj.)UIContainer);

如果输入参数个数< 2
递归= false;
结束
if recursive && ~ ishhandle (obj.Parent,'figure')
parentPos = getpixelposition(obj.像素位置)家长,递归);
pos = pos + [parentPos(1) parentPos(2) 0 0] - [1 1 0 0];
结束
结束getpixelposition

击败Birkhofer

如果我试图通过javacomponent()在这个Tbx创建的面板中放置JScrollPane,我会得到一个“无效的父规范”错误。我可以在面板中放置一个uipanel,例如通过uiextras.Panel()创建,但随后我失去了方便的自动调整大小功能(对于uipanel)。是否有更优雅的解决方案来添加java组件?

击败

本Tordoff

你好斯文。你对细节的关注给我留下了深刻的印象!

在此工具的前一个迭代中,我们曾经允许“合并”网格元素。但是它的API很糟糕。我们从来没有回去尝试并提出一个好的API,但也许我们应该这样做?

斯文

本,大卫,

uiextras的“图标”。网格makes it look like you can define a grid, and have one axis span multiple entries on that grid. I don't think, however, that this is actually possible.

类似的例子是调用subplot,如下:

图,子图(2,2,[1 3]),峰值
次要情节(2 2 2),峰值
次要情节(2,2,4),峰值

那么,是否可以做一个像下面这样的网格:

figure, G = uiextras.Grid('Parent',gcf);
B13 = uicontrol('父',G, '字符串','按钮跨越[1 3]');
B2 = uicontrol('Parent', G, 'String','Button in spot 2');
B4 = uicontrol('父',G, '字符串','按钮在位置4');
集(G,“RowSizes”,[1])

...然后让第一个按钮跨越两行?

艾莉婕

嗨,本,大卫,

非常感谢您的GUI布局工具箱,这是一个漂亮的工具。
它与可编程gui一起工作得很好,但我正在努力使它与我的GUIDE gui一起工作:我有几个GUIDE生成的窗口,每个窗口中都有几个面板。我想使用您的工具,使这些面板调整自己的大小优雅,但我不想重新定义编程中所有我的处理这些面板。你能在文档中添加一个如何做到这一点的例子吗?

非常感谢,
艾莉婕

亚当Filion

有没有办法让一个面板的标题栏有多行?我有一个组件,说30宽,但我想包括的标题需要更多的空间,它被切断。有什么建议吗?谢谢。

大卫·桑普森

我们将在适当的时候发布对HG2的金宝app支持。

伟大的工具,

谢谢

亚尼克

嗨,本,大卫,

我有问题与最新的版本和改变轴与补丁对象的限制。

如果你有:
f =图
b = uiextras。VBox('Parent', f)
a1 =轴(“父”,b)
a2 =轴(“父”,b)
contourf(峰值)
set(a2, 'YLim', [10 30])

你会看到轮廓从坐标轴延伸到相邻的元素上。

有没有一种方法可以让坐标轴正确地更新自己?

非常感谢,
亚尼克

科林

嗨,本,

我一直在尝试使用tabpanel来可视化数据集。我可以创建并绘制到几个选项卡,每个选项卡都包含一个灵活的轴网格:

TP = uiextras.TabPanel(图)“父”,
对于p = 1:Ntabs;
女朋友= uiextras.GridFlex(“父”,TP)
对于q = 1:纳克斯
axh (p, q) =轴(“父”,GF);
结束结束;

...
情节(axh (p, q),…)

不幸的是,如果我让数字在屏幕上相当大,当我改变选项卡时,旧选项卡上的轴没有完全隐藏,并模糊了新选项卡上的轴(基本上它看起来一团糟)。如果我稍微调整了图形窗口的大小,那么视图就会更新,坐标轴也会正确显示。通常前几次我改变标签的东西工作正确。

我在win7上的R2013a上使用GUIlayout v1p13。

任何帮助,包括一个工作区将非常感谢(执行刷新(gcf)没有帮助)!

问候,

科林

亚尼克

本,

实际上我不得不更改Container的334行。M到“position =[-10000 -10000 100 100];”;

似乎10/10的宽度/高度是崩溃的摆动轴函数,给轴包含在我的盒子面板<0的大小。

本Tordoff

你好亚尼克。这很容易做到。我会确保在下次更新中。如果你想在那之前测试它,用上面的作者链接给我发邮件,我会给你发一个补丁。

亚尼克

谢谢,Ben,我喜欢去掉两边的边界,这样看起来更简约。当我不需要额外的功能时,我用一个带有两个元素的VBox替换BoxPanel,这允许我没有边界。

本Tordoff

嗨,Yannick,谢谢你的修复-我会确保在下一个版本中更新它。

恐怕没有一个明确的默认属性列表。PanelBox会注意到默认的标题颜色,但仅此而已。

你想要删除哪个边框,标题周围的边框,内容周围的边框,还是两者都要删除?

亚尼克

我发现BoxPanel中dock按钮的底色少了一行。m:

在第251行添加以下代码可以解决这个问题:

如果isfield(obj.)HGWidgets_, 'DockButton') set(obj.HGWidgets_。DockButton,'BackgroundColor', value);
结束

亚尼克

嗨,是否有一个可以设置的默认属性列表?

DefaultBoxPanelShadowColor似乎不为我工作?

是否也有一种方法可以移除BoxPanel的边框?

欢呼,
亚尼克

亚当Filion

对于感兴趣的人,我可以使用Yair Altman的FEX提交屏幕捕捉来解决我下面描述的问题。不管出于什么原因,这是可行的,而MATLAB内置的GETFRAME没有。

安东Semechko

喜欢这个工具箱!!

Xha

为了澄清我之前的评论,我打算使用——

“使用面板和标签切换界面页面”与旧的matlab gui

Xha

有人知道或者能帮我吗?我想知道是否有一种相对直接的方法来组合这个gui的“窗格”功能,(使用顶部对应于每个窗格的选项卡),可以与常规的matlab GUIDE用法相结合,所以我可以有多个窗格,以一种相对简单的方式。我希望改造我的一些旧gui,而不必完全使用guilayout重新创建它们。

达尼

很久以前,我在这里评论并抱怨不同的ui控件,更具体地说,它们的文本不是垂直对齐的。使用Yairs findjobj可以通过直接操作底层java对象来对它们进行对齐。在我再次忘记如何做到这一点之前,我在这里提供了更新的例子:

数字
DUP = get(0, 'DefaultUicontrolPosition');
uicontrol(“风格”、“popupmenu”,“弦”,{‘是的’,‘不’},“价值”,1,“位置”,DUP);
胡= uicontrol(“风格”、“文本”、“字符串”、“测试”、“位置”,[5 + DUP (1) + DUP (3), DUP(2:4)],‘HorizontalAlignment’,‘左’);
[a,b] = findjobj(hu);
a.setVerticalAlignment (javax.swing.SwingConstants.CENTER);

迈克尔·奎因

亚当Filion

嗨,本,

非常感谢这个很棒的工具箱,这是一个真正的时间节省,摆脱了很多我的强迫症行为,让一切看起来正确。

我有一个问题要问你。我正在为高维数据创建一个图形用户界面。我想有一个选项,用户记录的数字在动画到一个文件,如avi或gif。然而,工具箱组件似乎不能很好地使用MATLAB的GETFRAME。有时它捕获的内容不显示更新的数据,有时组件被屏蔽,有时它捕获GUI背后的内容。无论如何,我从来没有得到过我想要的。

在使用GETFRAME之前,我还没有遇到过类似的情况。这是工具箱的已知问题吗?你有什么建议吗?谢谢。

本Tordoff

嗨,Dani,这与我们已经修复的传说问题有关。我对此也有一个修复,但它还没有完全准备好发布。看这个空间……

达尼

我有一个uiextras。panel的问题。如果我执行下面的代码,那么颜色条就在错误的位置,位于坐标轴上。这可以通过取消注释pause语句或替换uiextras来解决。面板与传统的uipanel,两者都不是很令人满意的解决方案。金宝搏官方网站我做错什么了吗?

F =数字
P = uiextras。面板('Parent', f);
c = uicontainer('Parent', p);
a =坐标轴('Parent', c);

pcolor(兰德(10));
%暂停(0.05)
colorbar

艾略特

在发布了我的最后一个问题后,我意识到我的上一个问题没有任何意义,因为它与我认为是股票Matlab的行为有关,但实际上不是。不过,我还有一个问题。我试图布局一个情节和一个合适的,并使它能够打印到一个pdf,看起来像屏幕上的图形。然而,尽管屏幕上的显示效果不错,但表格掩盖了pdf中的部分情节。有没有办法打印到矢量pdf,使它看起来完全像我在屏幕上看到的?

提前感谢你的帮助。

这是我使用的脚本:

X = randn(100,3);
summaryStats = [mean(X);性病(X);分钟(X);中位数(X);马克斯(X)];

FIG = gcf();
设置(fig, 'paperunits', 'inch ', 'papersize', [11 8.5], 'paperposition', [0 0 11 8.5]);
Set (fig, 'units', get(fig, 'paperunits'), 'position', get(fig, 'paperposition'));
设置(fig, 'resize', 'off');

vBox = uiextras。VBox('Parent', fig);

p = uicontainer('Parent', vBox);
ax = axes('Parent', p);
情节(ax, X);

tab = uitable('Parent', vBox, 'Data', summaryStats);
ext = get(tab, 'Extent');
set(vBox, ' size ', [-1 ext(4)]);

打印-painter -dpdf test.pdf

艾略特

我刚刚开始使用这个工具箱,它看起来很棒。一个问题:看起来标准的Matlab翻转功能(即在鼠标下显示图形上的值)只适用于最后添加的图形。有什么方法可以让它适用于一个图形中的所有情节吗?

Evgeny公关

@Ben Tordoff
哦,太棒了!谢谢你提供的有用信息!

肯•坎贝尔

优秀的工具。伟大的文档。作者令人难以置信的快速反应。

肯•坎贝尔

本Tordoff

谢谢你,Sven,我会处理这个问题并提交修复方案。

本Tordoff

你好Evgeny,我的建议是使用AppData,而不是UserData。它不仅更灵活,而且我发现它的速度要快得多。而不是

set(obj, 'UserData', data)

使用

setappdata(obj, 'MyData', data)

由于每个应用程序数据都被命名,所以每个对象中可以有多组用户存储的数据。这是一个更好的系统,与我们的uiextras布局工作得很好。

Evgeny公关

我认为在uiextras类中有一个'UserData'字段会很酷,就像所有的Matlab ui控件来存储用户数据和各种上下文。

斯文

本,发现另一个成员打嗝:

uiextras错误。容器/onChildParentChangedEvent (line 518)
[dummy, loc] = ismember(source, obj.)Children_);% #好< ASGLU >

Evgeny公关

@Ben Tordoff

谢谢!

我们必须为每个隐藏的子元素保留布局上下文(索引,大小,最小大小)。:)

本Tordoff

嗨,Evgeny,我可以看到你的用例,但我不是100%相信将一个小部件设置为隐形就等于说它不应该占用任何空间。我有一个GUI,我需要一个小部件出现/消失,而不影响其余GUI的布局。

我怀疑您可以通过简单地将元素的大小设置为0来实现您想要的效果。例如,给定一个有三个子的HBox,我可以通过这样做使中间的一个消失:

set(box, ' size ', [-1 0 -1])

并使它重新出现使用:

set(box, ' size ', [-1 -1 -1])

不需要摆弄可见性-一个零大小的小部件是不可见的!

本Tordoff

我被问过几次类似的问题,所以我想和大家分享我的答案:

“是否可以调整插入HBox的轴的位置,还是必须填充整个HBox ?”

答案,一如既往的计算,是一个额外的间接层!如果你把坐标轴放在uicontainer或uipanel中,并把它放在布局中,那么你就可以完全控制它在容器中的位置,同时仍然由布局管理整体位置。例如:

FIG = figure();

Box = uiextras。HBox('Parent', fig);

在有大量填充的容器中创建一些轴
c1 = uicontainer('Parent', box);
ax1 =坐标轴('Parent', c1, 'OuterPosition', [0.1 0.1 0.8 0.8]);

在没有填充的容器中创建一些轴
c2 = uicontainer('Parent', box);
ax2 =坐标轴('Parent', c2, 'OuterPosition', [0 0 1 1]);

谢谢你的反馈,Ben,非常感谢。

本Tordoff

嗨,Graham,一个布局面板一次只显示一个子元素。当你添加第二个轴时,它取代了第一个轴。与大多数计算问题一样,这可以通过额外的间接层来解决。简单地把你的组合轴放入自己的容器中,让它来管理位置:

f1 = figure('Name', 'Fig1');
P1 = uiextras。面板('Parent', f1);
c1 = uicontainer('Parent', p1);
ax1 =坐标轴('Parent', c1);
ax2 =坐标轴('Parent', c1, 'YAxisLocation', 'right');

这是处理任何由多个轴、ui控件等组成的自定义小部件的方法——只需要把它放在自己的容器中。

Katana13

用于创建gui的非常有用的工具箱。我不知道这是否是一个限制(Matlab R2012a,GUILayout_v1p12)。例子:
h =图(“菜单条”,“没有”,“工具栏”,“没有”,“标签”,“图”);
hcom = uiextras.HBoxFlex('Parent',h,'Tag','hcom');
STR = ' boub boub boub bou de la foucv oeufe fz ozfz efz fvousf zefzf ouvzfz fzo ufzf zouz fozufozf uzo fzoufzo fuziofz fzofiuzfoiz fouzfo ';
hEdit = uicontrol('Parent',hcom, 'Style','edit','Min',0, 'Max',2, 'HorizontalAlignment','left','Units','normalized','String',str,'Tag','hEdit');
com = uicontrol(‘风格’,‘编辑’,‘父’,hcom,“马克斯”,3,“敏”,1,“HorizontalAlignment”,“左”,“单位”,“归一化”,“标签”,“com”);
saveas (h,“测试”,“图”);

没有问题,如果您直接运行脚本。但是如果你启动保存的文件:'test。fig’,弹出2个数字(如果你使用“uiextras. fig”,可以。HBox而不是uiextras.HBoxFlex)

谢谢

非常令人印象深刻,它加速了复杂的GUI开发,并产生了更加精美的UI。

我遇到的一个问题是——尝试在面板中创建一个类似于策略的东西失败了,当创建第二个轴时,第一个轴消失了。

f1 = figure('Name', 'Fig1');P1 = uiextras。面板('Parent', f1); ax1 = axes('Parent', p1); ax2 = axes('Parent', p1, 'YAxisLocation', 'right');

斯文

是的,我同意Dan k的观点,网格处理起来有点麻烦。也许作为一个开始,“ByRow”vs“ByCol”选项可能会有所帮助。

丹,我做的一件事就是按列添加所有东西,然后在最后,抓取网格的子节点,并将它们重新排序到所需的顺序。例如:

C = get(GRID,'Children')
集(网格,“孩子”,[C(1:2:结束),C(2:2:结束)])

丹·K

令人难以置信的工具。有一项功能我还没有弄清楚:如何以不只是按列递减的顺序将项添加到父对象(比如Grid)中?唯一的方法是加入空的吗?同样地,我如何替换一个条目在网格/按钮框/标签面板一旦其他项目已添加?

谢谢,

本Tordoff

我已经提交了一个更新,应该修复图例问题。这应该会在接下来几天的某个时候出现在这里,一旦上传被批准。当它出现时,你能检查你的问题是否得到了解决吗?

新王

我发现我不能使用图例与这个工具。

例子:

错误()函数
S.f = figure();
tmph1 = uiextras.Panel('Parent',S.f);
S.Axes = axes('Parent',tmph1);
情节(S.Axes [1, 2]);
传奇(S.Axes{‘线’});

结束

本Tordoff

嗨,Sven,感谢你如此简洁地把这个问题解决了。我现在有一个修复这个准备上传。您应该会在接下来的几天看到它出现在这里。

伊恩

可以确认Sven在OS X +预发布2013a上的错误,在2012b上没有错误

斯文

哦,我使用的是最新下载的版本(上周下载的文件夹名为“GUILayout-v1p11”)。请注意,“ver”命令和文档发布说明仍然列出了“Version 1.10”,但没有日期。

斯文

哈,我花了半个小时解构我做的GUI,试图为你做一个漂亮的文件……事实证明,我们只需要4行就可以重现错误:

F =数字;
axSet = uiextras.HBox('Parent',f);
axH =坐标轴('Parent', axSet);
删除(axH)

上面的代码将在2012b(我假设更早)运行时没有错误,但它将在2013a预发布时产生错误。

它归结为容器内部的ismember调用。M对象删除功能,比较“轴”和“双精度”。

我不完全确定这是GUI问题还是MATLAB问题,所以调试愉快!

本Tordoff

嗨,斯文,谢谢你的提醒!我们在12月上传的版本应该已经修复了这个问题(我们正在进行隐式转换,将需要显式的转换加倍)。如果它还没有修复它,你可以发送一个例子,因为所有的例子,我现在与预发布的工作。

谢谢。

斯文

Ben,提醒一下,在2013a(预发布版)中,MATLAB内置的is成员函数似乎对比较“轴”和“双”类型更加挑剔,这影响了,例如:

m的第489行

此时,“source”的类型为“axes”,而“obj.”Children_”的类型为“double”。

伊恩

伟大的工具。我还看到了一个传说bug, Stefan的修复非常有效!

Alexander Stepanov

不幸的是,TabPanel和坐标轴的错误仍然存在。是的,轴现在总是呈现(调整大小或drawnow之前固定的效果),但是,像以前一样,当我切换到另一个选项卡时,它们并不隐藏。似乎这取决于轴嵌套的级别。例如,如果祖先是这样的:tab->uipanel->轴,那么一切工作正常。但如果我再加一层,它就会断裂,例如tab->uipanel->uipanel->坐标轴。(有趣的是,当切换到另一个选项卡时,ui面板的边框不会被渲染,所以它们确实是隐藏的,而轴是不隐藏的;他们甚至不再受这些边界的限制

Stefan

嗨,本,我在传说处理中发现了一个bug。在容器中。第448行:

Isa(孩子,“斧头”)

必须改为

isa (eventData。Child, 'axes')

第426行的强制转换意味着child永远是double。此错误导致图例被绘制为与轴不连接的独立对象。

海因里希

非常有用。非常感谢。

如果你能回答我以下问题
问题很完美:

我如何获得一个uiextras-Object的父对象?get(h, 'Parent')只是给我一个由它包装的普通的Matlab-Panel。

问候

海因里希

非常有用。非常感谢。

如果你能回答我以下问题
问题很完美:

我如何获得一个uiextras-Object的父对象?get(h, 'Parent')只是给我一个由它包装的普通的Matlab-Panel。

问候

胜过

神奇的工具箱,非常容易学习和使用。很好的函数支持动态布局。金宝app

尼古拉斯

我试着评论这一点,因为我有问题,但出于某种原因,我的帖子没有出现。我把它放在pastebin(点)com(斜杠)Hm5K4pL5

尼古拉斯

胜过

非常强大和易于使用,这应该是核心MATLAB的一部分。

尼古拉斯

格雷厄姆

有没有机会让它管理ActiveX控件,使他们看起来像他们是一个特定的面板的一部分,而不是一个单独的对象下的数字?我想能够把MSFlexGrid或MSTreeView控件放在面板上,并有它滚动和出现/消失与父TabPanel。

罗伯特。

很棒的代码,谢谢。我有一个问题,抱歉,如果已经解决了,我没有发现它。

一切都很正常,但当我试图向图表添加项目时——比如使用文本或补丁功能——它会将其添加到一个新图形中。这些函数并不适用于句柄,但即使我在运行这些函数之前激活了图形……它仍然创建了一个新的图形。

似乎我在这里遗漏了一些基本的东西,感谢你能提供的任何想法。

汤姆

看起来我的评论没有通过上次的评级。这一直是一个非常有用的工具箱,但我们有一个小的装饰性问题与VBoxFlex。似乎在50%的情况下,从右到左跨越伸缩边界会导致指针卡在“调整大小”图标中。如果我在边界上移动得非常慢(从右到左),那么100%的时间指针都会卡在“调整大小”图标上,但如果我在边界上移动得非常快,那么它似乎不会卡在调整大小图标上。注意,在我离开布局后,指针图标会回到正常的图标,或者再次从左到右移动边界。任何想法吗?

朱利安

这可能是交易所中最好的一段代码。它确实改变了我编写GUI的方式。哇。谢谢你! !

Sanchali Purandare

晶晶包

谢谢,本。我不知道setappdata/getappdata对,所以我实际上自己写了一个函数,只是把我的var添加到myhandles并附加到图形句柄。到目前为止,它对我来说很好:)。

本Tordoff

嗨,京晶,这就解释了。FINDOBJ的返回值始终是MATLAB图形原语。大多数这些布局都是使用几个原语构建的。现在我还没有办法让它们自己变成原语。

一个建议:您可能会发现,在图上使用"setappdata"/"getappdata"而不是使用guidata更灵活、更快。这是我常用的方法。

晶晶包

本,谢谢你的回复。我试着这样做:
高频=图;
bp = uiextras.BoxPanel('Parent',hf,…
“标签”,“boxpanel”);
英国石油公司。Title = '原标题';
hobj = findobj(高频、“标签”,“boxpanel”);
hobj。Title =“新标题”;

目标是能够在回调中修改标题。我想我可以使用findobj返回的带有标签字符串的句柄,但该句柄似乎不工作。我认为这是因为findobj返回的句柄是复合GUI对象容器的句柄,所以它与标题横幅没有直接关系。现在我使用guidata保存boxpanel的实际句柄,然后在回调中检索它,它工作得很好。
我不知道修改布局工具箱源代码来实现这一点有多难,我会花一些时间在完成当前任务后查找它。
再次感谢你分享一个很棒的GUI工具。

本Tordoff

嗨,京晶,很高兴你觉得这个有用。

bp = uiextras.BoxPanel();
英国石油公司。Title = '新标题';

是正确的方法,对我来说似乎很有效。你能不能更具体地说一下hObj是什么或者举个例子?hObj肯定是BoxPanel吗?

晶晶包

最好的之一!
我有一个与BoxPanel相关的问题,我试图通过hobj修改“标题”。Title='new Title',但它不起作用。有办法做到这一点吗?谢谢!

晶晶包

Eff

我相信我已经找到了重现这个问题的方法。如果我使用'painter '(默认)作为图形渲染器,问题就不会发生。然而,当使用opengl渲染时,上面提到的问题就会发生。

为了重现,在运行示例代码之前执行set(0,' defaultfigerenderer ','OpenGL') (text()没有区别)

不幸的是,“画家”不是我的选择,因为我正在做更高级的3d渲染。

Eff

嗨,本,
我把drawnow搞砸了。我给出的简单示例可以使用drawnow。但是,如果您在图形中额外使用文本函数,则无法正常工作。也许你可以在你的系统上重现这个问题:

mainGrid = uiextras。网格( 'Parent', figure);
tabPanel = uiextras。TabPanel( 'Parent', mainGrid, 'Padding', 5);

%第一个标签
firstbox = uiextras。HBox( 'Parent', tabPanel);
firstVBox = uiextras。VBox('Parent', firstHBox);
uicontrol('style', 'pushbutton', 'String', 'b1', 'parent', firstVBox);
轴(“父”,firstVBox);
抓住;
情节(1:10 0);
Text(10,10, '第一个标签的文本');
drawnow;

set(firstVBox, ' size ', [-1 -4]);

%秒TAB
secondHBox = uiextras。HBox( 'Parent', tabPanel, ...
“填充”,5);
secondVBox = uiextras。VBox('Parent', secondHBox);
轴(“父”,secondVBox);
抓住;
情节(100:1:1);
Text (50,50, ' Text of second tab');
drawnow;
uicontrol('style', 'pushbutton', 'String', 'b2', 'parent', secondVBox);

set(secondVBox, ' size ', [-4 -1]);

使用drawnow,我在第一个标签中没有任何图形。当使用drawnow时,效果与上面的截图相同(另外tab 2的文本是tab 1中的schon)。

非常感谢!

晶晶包

阿兰Barraud

嗨,本,
我找到了一个解决我的第一个问题的方法,把小的活动三角形符号不完全放在两个分裂面板之间的线分隔符上,而是分别在顶部面板和底部面板上自上而下和自上而下。分隔符句柄不是公共的,我没有修改您的类库。关于第二点,在Malcolm的FEX“Matlab swinging more”中有一个解决方案。但是我不是Java专家,malcolm代码很难理解。这个库有一些困难的问题,我想使用你的提交,这似乎非常稳定。
再次感谢

本Tordoff

嗨,Eff,谢谢你上传图片-我能看到问题。然而,我仍然无法在R2011b上使用Linux或Windows复制它。我成功地解决了另一个问题,这个问题很容易解决。你可以试试这个,但可能行不通。如果我们能想出如何在其他系统上重现这个问题,那就太好了。

另一个问题(根本不出现轴)的解决方法是在添加每个轴后添加一个“drawnow”。似乎轴的位置是不正确的,直到他们已经被绘制,这迫使一个初始绘制。另一种方法是在绘图后调整大小,但我怀疑这对您的情况有帮助。

如果你能找到一个适用于Windows(7)或Mac OS/X (Lion)的例子,那就太好了,因为Windows和Mac OS/X的变体比Linux少得多!

干杯

Eff

另外,在我之前的工作中,我的Mac也遇到过类似的问题。

本Tordoff

嗨,Alain,自定义任何布局的最简单的方法是采取相应类的副本,重命名它,然后开始添加你想要的位。希望大多数代码都在不明显的地方注释了。

我将考虑如何最好地处理太多的标签。在工具箱中以一种更优雅的方式处理这个问题会很好。如果你在我之前想出了什么好东西,请分享!

干杯

本Tordoff

嗨,滚开,

我刚刚尝试了你的例子,没有看到任何奇怪的事情发生。这可能意味着我正在尝试与您不同的平台/版本组合。你在什么平台上运行(Windows、Mac还是Linux)?还有,哪个MATLAB版本?如果我能重现这个问题,我可能就能告诉您哪里出了问题,以及解决它(甚至修复它)的最强大的方法。

Eff

用于创建gui的非常有用的工具箱。然而,要么我发现了一个错误,要么我使用工具箱不正确:

如果有几个选项卡都有一个axis对象,那么无论当前哪个选项卡处于活动状态,其中一个axis对象总是在顶部:

我能找到的最简单的例子来重现这个问题:

mainGrid = uiextras。网格( 'Parent', figure);
tabPanel = uiextras。TabPanel( 'Parent', mainGrid, 'Padding', 5);

%第一个标签
firstbox = uiextras。HBox( 'Parent', tabPanel);
firstVBox = uiextras。VBox('Parent', firstHBox);
uicontrol('style', 'pushbutton', 'String', 'b1', 'parent', firstVBox);
轴(“父”,firstVBox);
抓住;
情节(1:10 0);

set(firstVBox, ' size ', [-1 -4]);

%秒TAB
secondHBox = uiextras。HBox( 'Parent', tabPanel, ...
“填充”,5);
secondVBox = uiextras。VBox('Parent', secondHBox);
轴(“父”,secondVBox);
抓住;
情节(100:1:1);
uicontrol('style', 'pushbutton', 'String', 'b2', 'parent', secondVBox);

set(secondVBox, ' size ', [-4 -1]);

一个解决方法是从tabPanel中删除'Padding'属性。另一种解决方法是用uiextras.empty填充网格的单元格(这可以很容易地添加到gui)。

由于有几种可能的“解决方案”,我不清楚实际的问题在金宝搏官方网站哪里。有人能帮帮我吗?

阿兰Barraud

非常棒,写得很好,稳定,工作完美,在复杂的GUI应用程序中使用没有问题。
但是有两个问题。我如何在分离条上添加一些小三角形标记(作为活动按钮)来直接设置分割值为一些最大值和/或最小值。(uiextras.V(H)BoxFlex获得的两个分割面板之一的完整尺寸)。
当uiextra。TabPanelhas many panels, there may be not enough room to see all the titles. How to add some facility to sroll right or left in order to access to all title panels?

最后,文件是最好的之一,也许是我在FEX提交中从未见过的最好的!!
非常感谢!

延斯

布伦丹

嗨,本,

破解套件-应该成为核心MATLAB的一部分。

但有一个问题是,制表面板似乎不支持透明的3D绘图。金宝app我有一个应用程序,我需要两个面板用于3D图形和两个用于2D图形。我想在我的3D图中使用照明和透明度(所以用opengl渲染)。我做这个有问题。

例如:

F = figure();
P = uiextras。TabPanel( 'Parent', f, 'Padding', 5 );

坐标轴('Parent', p);
Plot (sin(0:0.1:2*pi));

坐标轴('Parent', p);
冲浪(高峰)

p.TabNames = {'Sin', 'Peaks'};

似乎不能正常工作。部分3D轴在2D面板中可见。我可以通过将渲染器切换到zbuffer来删除这种效果,但这样我就不能使用透明度了。

我猜这与MATLAB渲染组件的方式有关——有人有什么解决办法吗?

欢呼,

B

马克西姆Peuch

你建议的解决办法没有一个金宝搏官方网站管用。但我找到了一个方法:
我将main_Vbox声明为全局变量,而不是结构的一部分。这意味着在我的代码中做了一些调整,但它会工作得很好!

谢谢你的快速回答,它让我找到了解决方案。

与尊重,
马克西姆Peuch。

本Tordoff

嗨,Max,你能试着用“点”符号设置它吗?

GUI_data.main_Vbox。尺寸=[…]

在上面的评论中,一些人注意到在结构中放置布局时会出现一些奇怪的行为。这样一来,它们似乎就不被认为是合适的对象了。替代方案是这样的:

tmp = GUI_data.main_Vbox;
set(tmp, ' size ',[…]);

如果这两种方法有帮助,请告诉我。

马克西姆Peuch

嗨,本,
首先,伟大的作品!这正是我所需要的。
我有一个问题:

我创建了一个GUI。使用复选框,我想调整Vbox的组件的大小,但我有一个错误消息。

我创建了Vbox,并在其中放置了一些hbox。
在复选框的回调函数中,我写道:
设置(GUI_data。main_Vbox, ' size ',[…]);%GUI_data是处理所有GUI组件的全局变量。

错误信息是:
???使用==> set出错
uipanel类中没有'sizes'属性。

在==>的callback_function在174错误
设置(GUI_data。main_Vbox, 'size ', size);

???计算uicontrol回调时出错

显然,在其他函数中,一个Vbox在see中是一个uipanel。我如何改变'大小'属性从我创建它的函数之外?

谢谢你,马克斯。

Eric唐利

请把这部分做成核心MATLAB!我想要这个已经很久了。

本Tordoff

嗨,马丁,这个警告来自哪里——是mcc吗?工具箱不包含Tabpanel。p,那么这大概是从TabPanel.m编译过程中生成的文件?你用的是什么版本,这样我就可以试着复制同样的版本?

如果你有一个简短的例子来说明这一点,请随意通过我的作者页面发送给我(点击这篇文章旁边的我的名字)。

欢呼。本

camra data

我得到一个消息时,编译Tabpanel。在未来的版本中将不支持P…金宝app可以更新这个文件吗?谢谢,干得好。

杰罗德·Rivituso

达尼

你好再次,
这很尴尬,但我无法重现。所以请忽略这个。
达尼

达尼

你好,

getpixelposition。patch目录中的p只接受一个输入参数,而不是对应的Matlab函数。有可能同步这两个吗?

谢谢

达尼

本Tordoff

嗨,丹麦人,

我很高兴这对你的工作有帮助,即使有问题。我一直在研究消失轴的问题和加速初始化的方法,但现在没有任何好的解决方案,也不会破坏其他东西。金宝搏官方网站希望我能尽快找到一种方法来改进这些,并能够发布更新。

丹麦人奥斯丁

本,
谢谢你提供这么好的工具。我曾用它为激光实验室开发MATLAB应用程序——接口和从硬件获取数据,以及数据处理和可视化。您的工具包使事情变得更有条理,也影响了我使用MATLAB作为平台的决定。

一些反馈:
我经历过Brett和M Koelemay提到的消失轴问题。我已经在R2011b中测试了它们的代码片段,并再现了它们报告的行为。我还没有调查Brett的HBox位置解决方案,因为我的轴埋在几个层次深,不知道该玩哪个容器。然而,M Koelemay的调整建议每次都有效。

在性能方面,对于复杂的应用程序来说,启动时间有点麻烦。这可能与Holger建议移除obj有关。重绘语句。也许是一个全局请求延迟重画的命令,直到再次调用伙伴命令?这可以放在构造函数/GUI初始化代码中。

M Koelemay

顺便说一句,这个工具箱很棒

M Koelemay

我也有问题与“消失的轴”标签/卡片。有时坐标轴看起来“画了一半”或大小不正确,有时完全缺失。逐步完成下面的代码将说明这个问题(在R2010b和R2011a中进行了测试)。任何帮助都将不胜感激。

F =数字;
cp = uiextras.CardPanel('Parent',f);
p1 = uiextras.Panel('Parent',cp);
p2 = uiextras.Panel('Parent',cp);

g = uiextras.Grid('Parent',p1);
ax = axes('Parent',g);
情节(ax, randn (10,1));
ax = axes('Parent',g);
情节(ax, randn (10,1));

g = uiextras.Grid('Parent',p2);
ax = axes('Parent',g);
1)情节(ax, randn(30日);

%卡片2显示1个轴,都很好

cp.SelectedChild = 1;

%卡片1显示空白,但应该有2个轴

%稍微调整图形的大小使轴出现!
集(f,“位置”,获得* (f,“位置”));

%返回卡片2,显示为空白
cp.SelectedChild = 2;

%稍微调整图形的大小使轴出现!
集(f,“位置”,获得* (f,“位置”));

便雅悯

日本胜利公司

绝对棒极了!感谢作者提供这个非常有用的工具。

我遇到了一个问题——我发现包含GridFlex对象的图形在不挂起Matlab的情况下无法保存到磁盘。如果我简单地将GridFlex替换为Grid,那么一切都很好。当使用GridFlex保存图形时,文件实际上被写入磁盘,但Matlab必须手动关闭。当保存的图形随后被重新加载时,它会生成一系列错误,如下所示:

???尝试引用字段
non-structure数组。

错误==>
MousePointerHandler > @(变长度输入宗量)obj.onMouseMoved变长度输入宗量({}):
在42
集(无花果、“WindowButtonMotionFcn”、
@obj.onMouseMoved);

Sim卡

伟大的工具。

盒子面板有一个问题。当我将小部件设置为与默认的蓝色不同的颜色时,小部件没有得到正确的颜色(事实上,小部件的颜色在第71行被硬编码为'titleColor')。

伊娃

伟大的提交,gui有一个漂亮的外观。
我和Brett遇到过同样的“消失的轴”问题,但到目前为止,他的解决方案没有任何成功。
还有其他原因吗?
伊娃

布雷特Gyarfas

嗨,本,
谢谢你的回复,我想我找到我的问题了。它必须有一个轴,这是一个HBox的子,嵌入在一堆VBox & HBox的,并设置selectedChild到一个标签,其中轴不是。我能够通过确保VBox和HBox的单位被设置为标准化和位置设置为[0 0 1 1]来修复它。

这里有一个例子来说明。第一次运行它时,你会注意到“Page 2”是空的。如果您再次运行它,最后一行被注释掉,那么它似乎工作正常。如果你最后一次运行它,最后一行不加注释,第一个HBox的单位是标准化的,位置是[0 0 1 1](取消注释第7行,注释第8行),那么你可以从第一个Page开始,Page 2仍然正常工作。

%“消失”轴的例子
newFig = figure('工具栏','无','菜单栏','无','位置',[0 0 200 350]);

G = uiextras。TabPanel('Parent', newFig);

uicontrol('Parent', g, 'Background','r')

% z = uiextras。HBox('Parent', g,'Units', 'normalized', 'Position', [0 0 1 1]);
Z = uiextras。HBox('Parent', g);

uiextras。空('Parent', z);

Y = uiextras。VBox('Parent', z);

uiextras。空('Parent', y);

zxcv = axes('Parent', y,…
'ActivePositionProperty', 'Position',…
“GridLineStyle”,“none”,“TickLength”,…
[0 0],'XLim',[0 11], 'YLim', [0 11]);

tData = uint8(round(rand(10,10,3).*255));

image('Parent', zxcv, 'CData', tData);

uiextras。空('Parent', y);

set(y, ' size ', [-1 20 -1]);

uiextras。空('Parent', z);

set(z, ' size ', [-1 20 -1]);

g.SelectedChild = 1;

本Tordoff

布雷特,你能分享一个简短的例子来证明这一点吗?很高兴你觉得它有用又有教育意义。

谢谢

布雷特Gyarfas

很棒的工具箱!我喜欢通过查看代码来帮助我在MATLAB中进行自己的OOP工作。
我发现了一个bug与使用斧头和TabPanel。如果你在一个选项卡上有一个轴,你切换到另一个有一个“间距”的轴在另一个选项卡上,然后你可以看到轴。我不知道这是否与裁剪bug w/ UIPANELS有关,但我想我会把它放在那里。

再次感谢!
布雷特

艾蒂安

太好了,谢谢你,本。

本Tordoff

嗨艾蒂安,
我们有一些要求使布局的属性可观察,这将有帮助-我会研究这个。不过,你可以用一种更简洁的方式做到这一点:

<代码>
构建一个简单的GUI
h = uiextras.HBoxFlex('Spacing',10);
button = uicontrol('String', 'button', 'Parent', h);
table = uitable('Parent', h);
现在注意听动静
addlistener(按钮,'位置','PostSet', @(a,b) disp('按钮移动'));
addlistener(表,'Position', 'PostSet', @(a,b) disp('表移动'));
> < /代码

希望您可以将所需的回调插入到“addlistener”的最终参数中,然后就完成了。这也有一个好处,就是与布局无关——无论你如何设计你的GUI,它都能工作。

如果对你有用请告诉我。

艾蒂安

你好,本

我有一个合适的放置在一个HBox对象,并希望表调整大小与分隔符。我希望从HBox组件的回调做到这一点。我该如何实现这种类型的功能呢?

问候

艾蒂安

顺便说一句,这个工具箱很棒。

艾蒂安Coetzee

伟大的提交。使外观和感觉比以前好多了。谢谢。

约瑟夫Burgel

本,

关于7月1日的帖子,我创建了一个名为“Locked”的公共属性,并在TabPanel中包装了标签回调:

function iTabClicked(src, evt, obj, idx) %#ok

如果~ obj。锁着的
在选择选项卡之前调用用户回调
Evt =结构(…
'Source', obj,…
PreviousChild, obj。SelectedChild,……
'SelectedChild', idx);
uiextras。callCallback (obj。回调,obj, evt);
obj。SelectedChild = idx;
结束

结束% iTabClicked

将Locked设置为true将允许用户在活动选项卡上做一些事情,但不允许选项卡更改。我尝试子类TabPanel和重载'onChildAdded'和'iTabClicked'来做这件事,但不能让它工作,因为这些私有属性:

属性(SetAccess = private, GetAccess = private, Hidden = true)
Images_ = struct()
TabImage_ = []
PageLabels = []
结束私人财产

下一个版本,你可以添加锁定功能或将这些属性设置为“受保护”

伟大的计划。谢谢。

约瑟夫Burgel

嗨,本,

我有一个选项卡面板,我想在其中一个选项卡上实现“编辑”模式。用户不应该能够改变活动标签,直到她退出“编辑”模式。因此,在“编辑模式”中,选项卡控件应该被禁用。问题是,标签上的Enable属性禁用了标签子控件,所以用户不能在“编辑”模式下对标签的子控件做任何事情。我也不允许随后在孩子上更改Enable。我在你的代码中看到了改变这个的地方。我是否应该子类化TabPanel并实现我所描述的。你的评论吗?建议吗?

亨利·哈里森

嗨,谢谢你的工具箱!

我有一个简短的问题。有没有办法让一个ButtonBox表现得像一个uibuttongroup?基本上是强制一次选择一个按钮,和一个selectionchange回调。应该不难手动实现,但恐怕有点超出我的头脑。

尼古拉。

明白了:
删除(get(布局、'孩子'));

尼古拉。

没关系,我将重新安排使用整个列:/谢谢您的尝试!

你能帮我销毁/删除一个布局并替换成另一个吗?
或者更好:
如何清除布局的内容以重新填充它。

谢谢

本Tordoff

我尝试了一些事情,问了一些人,看起来得到正确的剪辑目前是不可能的。如果您只需要按钮和其他类似的小部件是可滚动的,那么可以使用MATLAB图形中嵌入的Java滚动面板来完成这一切。你不能把MATLAB的小部件放在其中一个。对不起,我想不出其他好的选择了。

尼古拉。

Jason Kinchen做了一个很好的ScrollPanel课程。
然而,它也缺乏剪辑“重量级对象”(按钮,表格等)的能力。

//www.tatmou.com/matlabcentral/fileexchange/29776-scrollpanel

尼古拉。

是本

我正准备阐述裁剪中出现的问题。
显然你已经理解了;)

"...使用一些育儿和剪辑设置的结合。”
如果你能给我更多的提示,我会尽量让它工作,并让你更新…

谢谢

Ps:张贴我自己的文件交换的想法还没有发生在我喷气机。既然你认为这是值得的,我确实考虑……

本Tordoff

嗨,尼古拉斯,这很好。谢谢大家分享。您可以考虑将其作为一个单独的File Exchange提交,并在此处发布一个链接。这样你就可以更新代码,而不必不断地重新发布它。

然而,有一些裁剪问题。如果你没有让主面板填充窗口(例如位置[0.1 0.1 0.8 0.8]),那么滚动面板的内容将显示在面板边界之外。这与面板是否填充图形无关。也许可以使用育儿和剪辑设置的一些组合来修复这个问题。我还没有机会尝试这些,但会让你知道。

谢谢。本

尼古拉。

addlistener(…;)

尼古拉。

抱歉之前的帖子,有一些bug…
这个版本也有鼠标滚轮功能:
(这可能不是张贴这个帖子的合适论坛,但我相信它可能会帮助本改进这个伟大的工具箱)
********************************
功能测试

主面板高度= 400;
Mainpanelwidth = 400;
滚动条宽度= 20;

f = figure('Position', [50 50 mainpanelwidth mainpanelheight],…
ResizeFcn, @slider);

Mainpanel = uiextras。HBox('Parent', f,…
“Units”,“normalized”,…
'Position', [0 0 1 1]);

控制面板= uiextras。VBox('Parent', mainpanel);
滚动面板= uiextras。VBox('Parent', mainpanel);

uicontrol('父',控制面板,'背景','r')
uicontrol('Parent', controlpanel, 'Background', 'b')
uicontrol('Parent', controlpanel, 'Background', 'g')

set(控制面板,'大小',[400,1000,200]);
controlpanelheight = sum(get(controlpanel, 'Sizes'))
Controlpanelpos = [1 (mainpanelheight-controlpanelheight) mainpanelwidth-scrollbarwidth controlpanelheight];
set(controlpanel, 'Position', controlpanelpos);

set(mainpanel, ' size ', [-1 scrollbarwidth]);

暂停(0.1);

scrollbar = uicontrol('Style', 'slider',…
'Parent',滚动面板,…
'String', 'drueck',……
“回调”,@slider);
addlistener(滚动条,'值','PostSet', @滑动条);
set(f, 'WindowScrollWheelFcn', @scroll);

set(scrollbar, 'Value', 1);

滑块;

函数滑块(~,~)
暂停(0.05);

set(主面板,'单元','像素');

mainpanelpos = get(主面板,'位置');
Mainpanelwidth = mainpanelpos(3);
Mainpanelheight = mainpanelpos(4);
controlpanelpos (2) = (mainpanelheight-controlpanelheight);
controlpanelpos (3) = (mainpanelwidth-scrollbarwidth);

如果(mainpanelheight > controlpanelheight)
set(滚动条,'值',1,'启用','关闭');
其他的
set(滚动条,'Enable', 'on');
%如果

slidervalue = get(滚动条,'值');

set(controlpanel, 'Position', [controlpanelpos(1) controlpanelpos(2)+(mainpanelheight-controlpanelheight)*(slidervalue-1) controlpanelpos(3) controlpanelpos(4)])

set(主面板,'Units', 'normalized');

set(滚动条,'SliderStep',[mainpanelheight/controlpanelheight/5 mainpanelheight/controlpanelheight])
结束

函数滚动(对象,事件)
scrollbarstep = get(滚动条,'SliderStep');
newscrollbarvalue = get(scrollbar, 'Value')-event.VerticalScrollCount*scrollbarstep(1);
如果(newscrollbarvalue > 1)
Newscrollbarvalue = 1;
elseif (newscrollbarvalue < 0)
Newscrollbarvalue = 0;
%如果
set(scrollbar, 'Value', newscrollbarvalue);

结束

结束
********************************

尼古拉。

重本!
谢谢你的反馈。
我已经设法让它为我的目的工作了。这里有一个例子(抱歉,没有记录):
********************************
功能测试

主面板高度= 400;
Mainpanelwidth = 400;
滚动条宽度= 20;

f = figure('Position', [50 50 mainpanelwidth mainpanelheight],…
ResizeFcn, @slider);

Mainpanel = uiextras。HBox('Parent', f,…
“Units”,“normalized”,…
'Position', [0 0 1 1]);

控制面板= uiextras。VBox('Parent', mainpanel);
滚动面板= uiextras。VBox('Parent', mainpanel);

uicontrol('父',控制面板,'背景','r')
uicontrol('Parent', controlpanel, 'Background', 'b')
uicontrol('Parent', controlpanel, 'Background', 'g')

set(控制面板,'大小',[400,400,20]);
controlpanelheight = sum(get(控制面板,'位置'));
Controlpanelpos = [1 (mainpanelheight-controlpanelheight) mainpanelwidth-scrollbarwidth controlpanelheight];
set(controlpanel, 'Position', controlpanelpos);

set(mainpanel, ' size ', [-1 scrollbarwidth]);

暂停(0.01);

scrollbar = uicontrol('Style', 'slider',…
'Parent',滚动面板,…
'String', 'drueck',……
“回调”,@slider);
set(scrollbar, 'Value', 1);

滑块;

函数滑块(~,~)
暂停(0.01);
slidervalue = get(滚动条,'Value')

set(主面板,'单元','像素');

mainpanelpos = get(主面板,'位置');
Mainpanelwidth = mainpanelpos(3)
Mainpanelheight = mainpanelpos(4)
controlpanelpos (2) = (mainpanelheight-controlpanelheight);
controlpanelpos (3) = (mainpanelwidth-scrollbarwidth);

set(controlpanel, 'Position', [controlpanelpos(1) controlpanelpos(2)+(mainpanelheight-controlpanelheight)*(slidervalue-1) controlpanelpos(3) controlpanelpos(4)])

set(主面板,'Units', 'normalized');
结束

结束
*************************
希望这能帮助到其他人…
问候!

本Tordoff

嗨,尼古拉斯,你的顶层布局默认为它的父图形(400x400)相同的大小,你还没有告诉它增长。它必须将其内容放入该空间,无论你告诉内容有多大,除非你也告诉布局要增长,否则它们将被缩小以适应空间。只需输入“set(layout, 'Position',[1 1 400 820])”,布局就会随着内容一起增长。

我不知道有什么简单的方法可以将滚动条添加到面板中。你可能可以用滑块一起hack一些东西,但我怀疑你会遇到裁剪的问题。不过我会做一些调查。

欢呼。本

尼古拉。

亚当:报价
很棒的包。但我想问一下,是否有可能在你们的面板上增加滚动条,如果有的话,我该怎么做?非常感谢你,亚当
"

我也想知道如何做到这一点。
这里有一个例子:

f = figure('Position', [50 50 400 400])
Layout = uiextras。VBox(“父”,f);
uicontrol('Parent', layout, 'Background', 'r')
uicontrol('Parent', layout, 'Background', 'b')
uicontrol('Parent', layout, 'Background', 'g')
set(布局,'尺寸',[400,400,20]);

窗口大小是400,我想添加3个项目,总大小大于400。
而不是使用滚动条,项目被缩放以适应窗口。
如果这种行为被要求,可以使用负数。

谢谢你的考虑和这个(其他)神话般的工具箱。
我期待着你的来信……

托马斯。

太棒了!

本Tordoff

你好,托马斯。您的示例产生一个错误消息,因为“units”应该有一个大写的“U”和一个大写的“P”位置。修好这个,在我看来,它工作得很好。

欢呼。本

托马斯。

我恐怕在所包含的示例中没有看到任何缩放行为-即使在06五月建议的更改中。我只看到一个灰色的身影。(使用MatLab 2011a)

代码如下:

f = figure('Position', 200*ones(1,4));
Vbox = uiextras。VBox( 'Parent', f, 'units','normalized', 'position', [0 0 1 1] );
axis ('Parent', vbox);
Hbox = uiextras。HButtonBox( 'Parent', vbox, 'Padding', 5 );
uicontrol('Parent', hbox,…
'String', 'Button 1');
uicontrol('Parent', hbox,…
'String', 'Button 2');
set(vbox, ' size ', [-1 35])

安德烈亚斯

西蒙

太棒了!谢谢,本!

本Tordoff

你好Simon,你需要设置“vbox”的单位归一化,位置为[0 0 1 1]。如果您希望它与图形缩放,这与您对任何其他MATLAB GUI元素所做的完全一样。我希望在未来再次将其作为默认值-它曾经是,但它导致了面板绘制方式的错误。

西蒙

嗯。也许我遗漏了一些东西,但我从文档中复制了以下代码:

f = figure('Position', 200*ones(1,4));
Vbox = uiextras。VBox( 'Parent', f );
axis ('Parent', vbox);
Hbox = uiextras。HButtonBox( 'Parent', vbox, 'Padding', 5 );
uicontrol('Parent', hbox,…
'String', 'Button 1');
uicontrol('Parent', hbox,…
'String', 'Button 2');
set(vbox, ' size ', [-1 35])

它根本无法扩展。

我对MATLAB gui完全不熟悉,所以如果这是一个愚蠢的问题,我很抱歉。

亚当

很棒的包。但我想问一下,是否有可能在你们的面板上增加滚动条,如果有的话,我该怎么做?非常感谢你,亚当

谢谢你的快速回应,本。这个问题已经在Bug#260354中解决了,所以我添加了关于该Bug的反馈。

本Tordoff

嗨,肯,
这是uipanel普遍存在的问题,不仅仅是那些被布局用来对内容进行分组的uipanel。你可以很容易地用一个UIPANEL重现这个问题:

f =图;
p = uipanel(“父”,f);
一个=轴(“父”,p);
title(“面板中的轴”);
轴(a,[-1 1 -1 1]);
矩形(“父”,一个“位置”,[2 -0.5 - 4 1],“FaceColor”、“r”);
补丁([0.5 - 0.5 0.75 - 0.75],[2 2 2 2],‘y’,‘父’,a);
line([-2 2],[-0.5 0.5],'Parent',a);

我强烈建议你在这里报告这个错误://www.tatmou.com/金宝appsupport/bugreports

在某些情况下,您可以通过将图形渲染器切换为OpenGL或ZBuffer来解决这个问题,但每种渲染器都有自己的特点。对于你的例子,这些其他渲染器以不同的深度顺序绘制线和补丁,所以它们可能只会让事情变得更糟。但是,我不知道还有什么建议。

很抱歉。

亚当·怀亚特

出色的工作!

为了防止它在上面的评论中丢失,我想重新发布一个我在剪辑中遇到的错误…

在布局框中放置坐标轴对象似乎会破坏在这些坐标轴上绘制的矩形和补丁的剪切(但奇怪的是不会破坏直线)。

下面是演示问题的代码片段…

f =图;
一个=轴(“父”,f);
title('没有GUI布局工具箱');
轴(a,[-1 1 -1 1]);
矩形(“父”,一个“位置”,[2 -0.5 - 4 1],“FaceColor”、“r”);
补丁([0.5 - 0.5 0.75 - 0.75],[2 2 2 2],‘y’,‘父’,a);
line([-2 2],[-0.5 0.5],'Parent',a);

f =图;
hbox = uiextras.HBox(“父”,f);
一个=轴(“父”,hbox);
标题('与GUI布局工具箱');
轴(a,[-1 1 -1 1]);
矩形(“父”,一个“位置”,[2 -0.5 - 4 1],“FaceColor”、“r”);
补丁([0.5 - 0.5 0.75 - 0.75],[2 2 2 2],‘y’,‘父’,a);
line([-2 2],[-0.5 0.5],'Parent',a);

朱利安Villegas

非常感谢您提供这个有用且文档完善的工具箱。

我遇到了一个问题,我希望在这方面更有经验的人能帮助我:

我的应用程序使用一个具有三个轴的FlexGrid,其中一个轴(底部的那个轴)包含几个jcontrol对象。除了用户调整包含jcontrol对象的轴或顶部轴的大小外,一切都运行正常,看起来很好。jcontrol没有被重新定位到它们应该在的位置。当轴被调整大小时,我如何调用函数?
谢谢你!

本Tordoff

你好,约翰逊,
感谢您的报告-这将在下一个版本中修复。与此同时,将“fight”替换为“obj”。Parent“在错误被击中的点上,这应该可以修复问题。

欢呼。本

有一个错误
???计算图形WindowButtonMotionFcn时出错

???未定义的函数或变量“fight”。

错误==> MousePointerHandler>MousePointerHandleronMouseMoved在79
currpos = hgconvertunits(figh, [currpos,0,0], figUnits,
'pixels', 0);

错误==> MousePointerHandler>@(varargin)obj.onMouseMoved(varargin{:}) at
42
集(无花果,WindowButtonMotionFcn, @obj.onMouseMoved);

???计算图形WindowButtonMotionFcn时出错

埃米尔

Ben,谢谢你的快速回复!你的建议起作用了。TabSize属性就是我要找的。

不要因为没有在文档中包含这一点而感到抱歉。我很感激这个工具箱一开始就有。其他一切都只是锦上添花:)

再次感谢!

本Tordoff

你好Emil,我相信你想要的是:

T = uiextras。TabPanel( 'FontSize', 16, 'TabSize', 150, 'Units', 'Normalized', 'Position', [0 0 1 1] );
uicontrol('Parent', t);
uicontrol('Parent', t);

TabSize属性可以让你控制标签的大小。如果这不能解决你的问题,请告诉我。由于某种原因,这个属性在文档中丢失了——对不起。

本Tordoff

谢谢你,杰西,我很高兴你觉得它有用。请随时为这个论坛添加任何改进或修复的建议-即使我不能全部实现,我也会跟踪它们。

欢呼。本

非常感谢你的精彩投稿。它是我的救星,让我看起来非常令人印象深刻:)

但我的问题是…JK,我以为我只留下一个没有问题的感谢声明!

埃米尔

首先,我要对你们的辛勤工作表示感谢。这是一个非常有用的工具,可以节省很多时间!

我有一个TabPanel的问题。每个选项卡的宽度是固定的,并且不随tabname扩展。如果我在默认的FontSize中有超过5个字符的TabNames,其余的就会被削减。它应该是这样的,还是我做错了什么?我也没有找到任何属性设置每个(或所有)选项卡的宽度。

致以最亲切的问候
埃米尔

本Tordoff

你好,帕特里克。是的,这是一个众所周知的问题。旧版本的默认单位是“标准化”的,位置是[0 0 1 1],这使得它充满窗口。不幸的是,这导致了一个bug,在面板的顶部留下了额外的空间。我不得不将它们更改回默认像素单位,这意味着它们不再随着窗口自动调整大小。一旦我找到了一种不破坏面板的方法,我希望将默认值恢复为“规范化”。

同时,简单地设置你最顶层的布局有像素单位和位置[0 0 11 1]。然后它将总是填充图形。只要它不是一个面板,你就不应该受到任何不良影响。

希望这能有所帮助。本。

帕特里克

嗨,很棒的工具箱!它应该是MATLAB标准扰动的一部分。

现在我的问题:我有两个vbox是孩子,一个hbox是孩子,我的主要人物。在旧版本中,hbox和两个vbox会随着windows的大小而调整,但在3月份发布的新版本中,它们不会调整大小。你知道为什么会这样吗?谢谢。

本Tordoff

嗨,约瑟夫。至于隐藏一个子元素,最好的方法就是不要重做,因为那样会使它很难放回正确的位置(例如,如果你想隐藏一个HBox的三个子元素的中间,那么就把它放回中间)。在许多情况下,简单地隐藏它就足够了:

F = figure();
H = uiextras。HBox( 'Parent', f, 'Units', 'Normalized', 'Position', [0 0 1 1] );
控制= [
uicontrol('Parent', h, 'String', 'Button 1')
uicontrol('Parent', h, 'String', 'Button 2')
uicontrol('Parent', h, 'String', 'Button 3')
];
暂停(1)

set(controls(2), 'Visible', 'off');
set(h, ' size ', [-1 0 -1]);
暂停(1)

set(controls(2), 'Visible', 'on');
set(h, ' size ', [-1 -1 -1]);

但是请注意,如果“Spacing”不为零,那么剩余元素之间就会有一些额外的空间。我也尝试过“重新养育孩子”的方法,下面的方法似乎很有效:

F = figure();
H = uiextras。HBox( 'Parent', f, 'Units', 'Normalized', 'Position', [0 0 1 1] );
Null = uiextras。HBox( 'Parent', f, 'Position', [-1000 -1000 10 10] );
控件= {
uicontrol('Parent', h, 'String', 'Button 1')
uicontrol('Parent', h, 'String', 'Button 2')
uicontrol('Parent', h, 'String', 'Button 3')
};
暂停(1)

set(控件{2},'Parent', double(null));
暂停(1)

set(控件{2},'Parent', double(h));

玛丽安Hertrich

嗨,本,

谢谢你的回复。同时,我们通过将父句柄放在括号中来解决这个问题
gui.box2 = uiextras。VBox('Parent', gui.box1); % here it works without problem
gui.edit1 = uicontrol(…
“风格”,“编辑”,
“父”,gui。(' box2 '));

无论如何,这个问题只发生在我们的少数GUI中,对于其他常规调用没有错误。也许我们的变通方法有助于定位和解决问题。

约瑟夫Burgel

下面是一些代码,显示了一个(至少一个)问题:

classdef test < hgsetget
属性
ShiftPanel
结束

方法

函数Test1 (Obj)

f = figure('Position', 200*ones(1,4));
Vbox = uiextras。VBox( 'Parent', f );
axis ('Parent', vbox);
Hbox = uiextras。HButtonBox( 'Parent', vbox, 'Padding', 5 );
uicontrol('Parent', hbox,…
'String', 'Button 1');
uicontrol('Parent', hbox,…
'String', 'Button 2');

结束

函数Test2 (Obj)

f = figure('Position', 200*ones(1,4));
Vbox = uiextras。VBox( 'Parent', f );
axis ('Parent', vbox);
Obj。ShiftPanel = uiextras。HButtonBox( 'Parent', vbox, 'Padding', 5 );
uicontrol('Parent', Obj.)ShiftPanel,……
'String', 'Button 1');
uicontrol('Parent', Obj.)ShiftPanel,……
'String', 'Button 2');
结束



结束

结束

Test1可以工作,但Test2不行。为什么我不能实例化一个成员属性,但我可以实例化一个局部变量??

约瑟夫Burgel

进一步调查发现,tab容器没有正确呈现,因为其中一个子uiextra容器包含了一个uicontrol对象。删除uicontrol,问题就消失了....

约瑟夫Burgel

只是为了回应父母的担忧。把集装箱从一个父母那里搬到另一个父母那里,我运气不太好。使用double()没有帮助。uiextras父母或经典的Matlab父母似乎并不重要。有时我在uiextra代码中得到索引错误,其中孩子的数量是不正确的。现在,我得到一个Tab视图不正确呈现的问题,因为子容器被重新养育。

约瑟夫Burgel

如果需要临时从父容器中删除一个容器,应该怎么做?比如说,由于国家的原因,我只想要2个孩子而不是3个。我该把第三个孩子放在哪里。我的解决方案是给图形一个不可见的“Null”容器,并在我不需要它时将孤立容器父化为Null。当我尝试使用Uiextras时。面板为“Null”我在uiextras代码中有几个错误。当我创建空容器的类型uipanel时,它工作了。不知道为什么uiextras。面板坏了?好方法还是保留孤儿容器?

塞巴斯蒂安举行

嗨,本,
谢谢你的快速回复。好吧,之前读过,但没有意识到这是同一个问题。对不起,噪音太大了。

本Tordoff

嗨,塞巴斯蒂安,玛丽安,

这已经出现了几次,现在略有不同的方式,而我仍然不知道原因,补救措施是调用double(布局)显式转换布局为双句柄:

集(u,‘父’,双(布局));%相应

它不应该是必要的,在旧的MATLAB版本中也没有。正在调查中…

塞巴斯蒂安举行

我有一个问题,在一个布局指南中绘制的对象:
f =图;
u = uicontrol (f,“风格”,“框架”);
Layout = uiextras。GridFlex( 'Parent', f );
集(u,‘父’,布局);%相应
???使用==> set出错
参数必须为“hgsetget”。
isa(布局、“hgsetget”)
Ans = 1

为什么Matlab 2010b不能将布局识别为“hgsetget”?

玛丽安Hertrich

嗨,本,谢谢你提供这么好的工具。我们使用Gui Layout Tool v1p8开发了一个相对较大的项目。
我刚刚在2010b上测试了它,并在9月15日得到了William Weideman解释的错误:从未知转换为double是不可能的。
在容器中。m有一个函数,实际上应该在结构(function container = double(obj))中强制转换句柄,但我仍然得到相同的错误。应用你的变通方法需要做很多工作。有更好的解决方案吗?

本Tordoff

嗨,Dani, Dirk,很抱歉没有回复。只要我有时间,我就会调查这些问题。耐心听我说!

达尼

我想我和安德鲁·斯坦普斯有相似的问题。当我切换到1.8时,我所有的布局都突然有了额外的空间。这可以用以下代码复制:

F = figure();
H_p = uiextras。面板( 'Parent', f, 'Title', 'Test', 'Padding', 0);
H_vbox = uiextras。VBox('Parent', h_p, 'Padding', 0, 'Spacing',0);
uicontrol('Parent', h_vbox, 'Style', 'text', 'String', 'Test', 'HorizontalAlignment', 'Left');

uicontrol和顶部面板边框之间有一个很大的间隙。在1.8之前,这不是情况,我不知道如何控制这一点。

德克·恩格尔

感谢本和大卫的贡献。灵活的盒子最终提供了一种真正的交互式GUI可伸缩性的方法。没有发现可比性。

不幸的是,对于大型GUI应用程序仍然存在一些错误和缺失的特性(在v1.8中)。如。
*对于有2个或更多分隔板的容器,将一个分隔板滑到另一个分隔板后面,在容器>中投掷“宽度和高度必须为> 0”。repositionChild在340
*分隔符经常重叠相邻面板的边界,看起来非常不专业(可能是像素位置的舍入问题?)
*在许多嵌套的灵活盒子的情况下,糟糕的重绘(一个人必须看着控件来回调整大小,直到最终结果)
*用户定义的WindowButtonUpFcn在任何图形模式打开时(例如缩放)移动分隔符时丢失。关闭模式时,恢复的是分割器的WindowButtonUpFcn,而不是用户自定义的回调函数。
*最好有:高度和宽度限制,以及其他对灵活容器的限制。也许你可以从另一个很好的布局管理器GridBagLayout中吸取一些想法。多亏了OOP,我当然可以通过子类化来做到这一点,但也许该功能可以在uiextras工具箱中找到它的方式。

约瑟夫Burgel

我得到了上面Holger提到的相同的bug:

尝试移动示例“gridflexpositioning”中的垂直网格伸缩分隔符。只有水平分割线是有用的。

andres llopis

你好了。我使用的是1.6版本的工具。有可能隐藏一个标签在一个标签面板?我不想删除它,只是把它藏起来。

还有一个问题:当你隐藏一个按钮在一个Vbox,其大小是固定的像素值(没有负值),它是否可能自动调整大小?例如,下面的按钮可以向上移动,以填补你隐藏的那个按钮留下的空间。

非常感谢大家=)

约瑟夫Burgel

好主意。谢谢你戴夫。

大卫·桑普森

针对自定义调整大小行为的问题,子类化我们相关的类并实现你自己的调整大小方法。

约瑟夫Burgel

我正在考虑的问题,例如,我想保持伸缩盒儿童的纵横比。所以,我想知道何时伸缩盒调整大小-理想情况下,只是在调整大小之前和之后。然后,在此基础上,我可能会改变子容器的大小属性,调整面板的大小等。我没有看到这些事件或预设后置的回调,seobservable属性设置允许这在理想的属性。比如flex resize,我目前使用子uipanel resize handler来做这个,但这看起来很草率。有人有一个“最佳实践”方法来处理工具箱中的调整大小事件吗?

andres llopis

你好!

我有一个问题的堆叠组件。我希望能够将一个vbox的子元素移动到另一个子元素的后面,以便在界面中滚动。问题是移动的孩子总是在上面。我尝试过使用uistack,但它也不起作用。

任何帮助都将不胜感激。谢谢你!

谢谢Ben和David的这个工具箱,我发现它很有用。

我想我发现了一个漏洞。在布局框中放置坐标轴对象似乎会破坏在这些坐标轴上绘制的矩形和补丁的剪切(但奇怪的是不会破坏直线)。

下面是演示问题的代码片段…

f =图;
一个=轴(“父”,f);
title('没有GUI布局工具箱');
轴(a,[-1 1 -1 1]);
矩形(“父”,一个“位置”,[2 -0.5 - 4 1],“FaceColor”、“r”);
补丁([0.5 - 0.5 0.75 - 0.75],[2 2 2 2],‘y’,‘父’,a);
line([-2 2],[-0.5 0.5],'Parent',a);

f =图;
hbox = uiextras.HBox(“父”,f);
一个=轴(“父”,hbox);
标题('与GUI布局工具箱');
轴(a,[-1 1 -1 1]);
矩形(“父”,一个“位置”,[2 -0.5 - 4 1],“FaceColor”、“r”);
补丁([0.5 - 0.5 0.75 - 0.75],[2 2 2 2],‘y’,‘父’,a);
line([-2 2],[-0.5 0.5],'Parent',a);

斯文

本,看到你回复评论/请求真是太棒了。我还遇到了一个uiextras的轴创建。面板错误,并创建了一个错误请求。你可以用下面的函数重现错误:

函数testgui()
figH =数字;
s.normalPanH = uipanel('Parent',figH);
s.uiextraPanH = uiextras.Panel('Parent',figH);
tmp = s.uiextraPanH;
axH1 =坐标轴('Parent', tmp);%执行此命令
axH2 = axes('Parent', s.normalPanH);%执行此命令
axH3 = axes('Parent', s.uiextraPanH);%该命令错误
结束

有趣的是,这些相同的命令粘贴到命令窗口中并不会抛出错误——它只在嵌入到函数中时才会发生。

我已经创建了bug报告:1-DX1A26

安德鲁的邮票

本,

这与我上面发布的例子基本相同,但我相信它证明了我的观点:

F1 =数字;
P1 = uiextras。面板('Parent', f1, 'Title', 'Panel 1');
P2 = uiextras。面板('Parent', p1, 'Title', 'Panel 2');

F2 =数字;
P3 = uiextras。面板('Parent', f2, 'Title', 'Panel 3');
P4 = uiextras。面板('Parent', p3, 'Title', 'Panel 4', 'Units', 'Pixels');

与图2中的面板3和面板4相比,图1在面板1和面板2之间的顶部和右侧有额外的空间。我只是重新安装了v1.8,并从我的路径中删除了所有其他版本作为预防措施。我用的是R2010B。

我们似乎无法上传文件,否则我也会附上截图。

谢谢,
安迪

本Tordoff

你好Andrew,在面板顶部附近出现空白区域的问题应该已经在v1.8更新中得到了解决。如果不是,你能发送一个简短的例子来说明问题吗?
谢谢。本

安德鲁的邮票

我需要收回我对Panel.m第133-134行所做的“更正”。然而,我相信我现在离答案更近了。在标准化单元中,边界/所有权区域从控制区域中排除。当你指定obj。showselectedchild的宽度和高度时,你必须补偿这个。如果有兴趣,我可以提供代码。

安德鲁的邮票

我想继续我之前的评论。首先,我相信Panel的133-134行。M应为:

X0 =边界;
Y0 =边界;

同样,归一化面板的问题似乎是uipanel在面板顶部保留了一些空间,这样一个归一化的位置[0 0 1 1]并不能完全覆盖getpixelposition返回的区域。我还没有弄清楚如何设置/获得什么“标准化”区域实际上是相对于getpixelposition区域。

谢谢,
安迪

安德鲁的邮票

本,

我觉得这个工具箱很棒。这已经为我节省了大量的时间。但是,我想指出最近出现的一个问题。我相信您在v1.7中修改了添加子元素时单元设置行为的错误已经产生了一些意想不到的后果。这里有一个简单的例子:

F =数字;
P1 = uiextras。面板('Parent',f,'Title','Panel 1');
P2 = uiextras。面板('Parent',p1,'Title','Panel 2');

这将产生一个数字,其中在第一个面板和第二个插入面板的顶部之间有一个过大的间隙。在以前的版本中(肯定是v1.5),差距要小得多。如果你明确地为第二个面板指定像素单位:

F =数字;
P1 = uiextras。面板('Parent',f,'Title','Panel 1');
P2 = uiextras。面板('Parent',p1,'Title','Panel 2','Units','pixels');

然后,图形最初看起来与第一个示例相同,但当您调整图形的大小时,第二个面板突然像以前一样紧紧地扣在第一个面板上。

我猜你的意图是让结果相对独立于所使用的单位,但情况似乎并非如此。

谢谢,
安迪

Holger

嗨,本,

刚刚试了一下,“打印”和“保存”(工具栏按钮)是可以工作的。非常感谢!

但我认为,你引入了一个漏洞:
尝试移动示例“gridflexpositioning”中的垂直网格伸缩分隔符。只有水平分割线是有用的。

再次感谢,
Holger

本Tordoff

嗨,霍尔格,我刚刚更新了包装,修复了打印问题。如果你还有问题请告诉我。

本Tordoff

你好,霍尔格,我星期一会调查打印问题。现在和那时之间的一个变通方法是使用getframe而不是print。不理想,我知道。希望我周一能修好。

我会考虑一下性能,看看是否有一个好方法来减少重绘的次数。

欢呼。本

Holger

我喜欢它。

关于业绩:
在许多位置外注释obj.redraw()后,它并不是那么慢,可以用于具有许多元素的复杂布局。
特别是Container::OnChildAdded()和set.Children()与obj.redraw()是一个真正的性能打击。
因此,我正在构建GUI并在添加了所有子元素后手动调用redraw()。

另一个性能问题是ver('Matlab')。我只是简单地使用旧版本,它也适用于新版本。

但有一个问题:
我的数字与gridflex无法打印或保存(例如png)。我在Mathworks 'print.m'中得到一个错误。

有人能调查一下吗?

Holger

科里Gravelle

恐怖小说类别嗯! !这是一个救世主,万分感谢

托尼

andres llopis

Sherif Elnabarawy

终于得到了我要找的东西!出色的工作,优秀的文档!非常感谢!
现在,我正在使用那个fcns,但我需要问一些事情,首先我可以分配一个以上的孩子到HBox或Vbox,并给他们一个定位值?如果我为每个需要设置大小调整状态的孩子创建了盒子,那么我将创建许多减慢应用程序的盒子。
第二,我可以合并特定的框吗?

非常感谢,
Sherif Elnabarawy。

本Tordoff

嗨,威廉,我还没有机会真正深入研究这个细节,但我怀疑问题出在结构上。由于某种原因,在R2010b中,如果对象存储为结构的字段,那么调用“double”方法会失败。我没有找到任何方法来解决这个问题,除了在使用之前获取一个临时的布局副本:

temp = gui.aDetailPlotB;
axes1 = axes('Parent', temp,…);

这似乎是可行的。这看起来像是R2010b和R2010a之间的明确回归,我鼓励您使用MathWorks主页上的链接来报告它。我也会这么做!

让我知道这是否有效(即使它很痛苦)。本

威廉Weideman

我最近不得不升级到R2010b版本,现在我在传递句柄到Gui布局中创建的对象时遇到了问题。它需要大量的代码(就像Dani上面提到的那样,一个有速度问题的大布局)。我将展示什么是相关的恕我直言。

全球gui
...
函数gui = createInterface()
为应用程序创建用户界面并返回
%用于全局使用的句柄结构。
GUI = struct();
...
gui。aDetailPlotB = uiextras。面板('Parent', aDetailPlot, 'BackgroundColor', 'w', 'BorderType', 'none');

...

在另一个函数文件中,gui结构被作为参数传递,然后我们得到:

axes1 = axes('Parent', gui.aDetailPlotB,
“ActivePositionProperty”、“OuterPosition”);

我得到以下错误消息。

???使用==>轴时出错
从unknown转换为double是不可能的。

通过调试器,进入Container。M (+uiextras文件夹的一部分),它在函数中死亡

函数容器= double(obj)
将一个容器转换为HG双手柄。

% D = double(C)将容器C转换为HG手柄D。
container = obj.UIContainer;
结束% double

我不能回到R2010a,所以我如何让它工作?

提前谢谢你。

达尼

大型布局的响应时间变得相当慢,主要是由于频繁调用getpixelposition。即使只是从一个数字菜单切换到另一个也可能需要一段时间。是否可以禁用布局管理?只要数字没有被调整大小,所有这些调用基本上都是不必要的。

大卫·桑普森

在回答关于面板装饰尺寸的问题时,首先让我陈述一个明显的事实,以防它不明显。一旦一个包含容器的面板出现在屏幕上,你就可以调用面板和容器上的getpixelposition来查找装饰的大小。

GUI布局工具箱采用由外而内的方法,因为内容不会影响容器的大小。你给一个容器一些空间,它就会尽可能地摆放里面的东西。如果内容物对容器来说太大,那么它们就会消失在顶部或右侧。这是工具箱工作的基础。

我一直期待一个请求,以支持最小大小的内容。金宝app任何对此感兴趣的人都可以通过添加属性和重载重绘制来扩展他们所选择的容器。在增加和删除儿童时,需要注意反应;请参阅我们如何处理“尺寸”以获得指导。

接下来的问题是如何为每个孩子确定最小的合理尺寸。我推荐硬编码。uicontrol确实提供了一个属性'Extent',但它没有为组合框返回任何有用的东西,并且它给出了规范化单位的错误答案,容器和轴都没有报告Extent。

可以通过钩入图形ResizeFcn来强制限制图形大小。我不建议低于身材的人尝试。

约瑟夫Burgel

刚刚回答了我自己的问题,我正在处理标签控件的“回调”属性。这是可行的。

没关系……

约瑟夫Burgel

我需要处理在选项卡容器中选择新选项卡时的条件。这意味着我想要处理SelectedChild属性更改事件。当我运行findprop时,我看到SelectedChild的seobservable为0。有什么建议吗?为什么这个不可能是1?谢谢。

mp = findprop(data . container . h_righttabpanel,'SelectedChild')

议员=

元。财产处理
包:元

属性:
名称:“SelectedChild”
描述:“
DetailedDescription:“
GetAccess:“公共”
SetAccess:“公共”
依赖:1
常数:0
文摘:0
瞬态:0
隐藏:0
GetObservable: 0
SetObservable: 0
AbortSet: 0
GetMethod (function_handle):
SetMethod (function_handle):
HasDefault: 0
定义类:[1x1 meta.class]

达尼

刚刚尝试使用VBoxFlex,不能看到不能访问可拖动的分隔线。原来,这是因为我创建的图形DefaultUIControlUnit设置为'norm', GUI布局工具箱似乎依赖于此设置为像素。

谢谢你对我其他问题和评论的回答!
(面板标题/标题高度的大小仍然是开放的)

大卫·桑普森

Dani,在回应你关于在一排控件中垂直对齐文本的帖子时,我同意这是一个问题。此问题是HBox特有的。

我们需要uicontrol的VerticalAlignment属性。

我认为解决这个问题的方法是在uicontainer中创建一个作为uicontrol实现的文本标签小部件。小部件公开了一个属性来控制垂直对齐并相应地定位uicontrol。我已经创建了这样一个小部件,以包含在我们即将到来的GUI控件工具箱中。

另一种可能性是在底层Java对象中设置垂直对齐,Yair Altman的findjobj可以提供对该对象的访问。

我不认为在HBox中添加一个属性来提供垂直填充是一个好的解决方案。

plotyy是另一个MATLAB的例子,使用两个轴在同一层次的HG层次。同样,将坐标轴放入容器中,并定位容器。

>> h = uiextras。HBox( 'Padding', 10, 'Spacing', 10 );
>> c = uicontainer('Parent', h);
>> v = uiextras。VBox( 'Parent', h, 'Spacing', 10 );
>> for ii = 1:4, uicontrol('Parent', v, 'String', 'Press me');结束
>> a =坐标轴('Parent', c);
>> x = 0:0.1:10;
>> plotyy(a, x, sin(x), x, 10*cos(x));
>> h.Sizes = [-1 150];

约瑟夫Burgel

我现在要处理的一件事是需要将两个轴相互重叠。为了在同一个平面上得到两个Y轴。我最好的猜测是将两个轴放在一个uipanel中,然后将面板添加到父容器中。听起来是最好的方法吗?

MATLAB在第二组轴上绘制颜色条,这是第一组轴的兄弟。要使用颜色条定位轴,请将轴放在容器中,并对容器进行定位。MATLAB将负责在容器内定位绘图和颜色条。

>> h = uiextras。HBox( 'Padding', 10, 'Spacing', 10 );
>> c = uicontainer('Parent', h);
>> v = uiextras。VBox( 'Parent', h, 'Spacing', 10 );
>> for ii = 1:4, uicontrol('Parent', v, 'String', 'Press me');结束
>>轴('Parent', c);
> >山峰;colorbar;
>> h.Sizes = [-1 150]

达尼

最后一个,我保证。

在您的帮助文件中,您将展示如何处理轴的定位。然而,大多数情况下,一个轴与相应的颜色条,这将是有帮助的指导方针,如何处理两者。

达尼

更多的问题。

1.
ui控件,如“文本”和“编辑”样式,允许更改它们的高度。例外是“popmenu”,它坚持默认高度(至少我没有办法绕过它)。结合ui控件似乎不允许内容垂直定位的问题,当我们组合不同的ui控件时,我们得到了相当难看的顶部对齐。

数字
DUP = get(0, 'DefaultUicontrolPosition');
uicontrol(“风格”、“popupmenu”,“弦”,{‘是的’,‘不’},“价值”,1,“位置”,DUP);
uicontrol(“风格”、“文本”、“字符串”、“测试”,“位置”,[5 + DUP (1) + DUP (3), DUP(2:4)],‘HorizontalAlignment’,‘左’);

由Jason在文件交换中贡献的GridBagLayout通过允许指定诸如“TopInset”之类的嵌入来解决这个问题。我认为这个问题的解决方案是必要的,因为由代码(如上面的片段)产生的ui看起来并不专业。

2.
GridBagLayout的另一个很好的特性是它允许元素的轻松分布。让我们假设我有一个VBox面板,包含3个hbox和一些ui控件。我想在VBox中指定单个条目的高度为uicontrol的默认高度,这是可能的“尺寸”。然而,我想这三行平均分布在整个面板的高度,这意味着“间距”在VBox应该自动计算,这不是情况。

有办法解决这两种情况吗?

达尼

感谢添加设置默认值的可能性!

我还有一个要求。为了弄清楚一个图形应该有多大,有必要知道放入其中的所有物体的大小。我有一个带有几个面板的VBox,其中又包含包含HBoxes的VBox。我可以指定所有的尺寸和间隙,除了多少面板的标题。看起来需要大约。15像素,但是,如果您为各种类型的面板指定这个值将会很有用。谢谢。

Tanyer艾伦

约瑟夫Burgel

谢谢你的帖子。示例将无法运行。我使用ML 7.5 2007b。2007b不支持“包”。金宝app所以,我猜这个工具箱不适合我,对吧?遗憾的是,这本来能帮上大忙。谢谢。

本Tordoff

嗨Jaoa,

它应该可以在R2008b上工作,尽管它不是这样设计的,而且在R2010a之前也没有在任何东西上进行过彻底的测试。虽然文档中的示例使用了新的“~”语法,但工具箱代码本身并没有使用任何R2010a特定的语言特性。我已经删除了“功能”命令,并将上传一个新版本,应该为您工作。我们瞄准了当前的发布版本,因为它是与我们一起开发GUI构建项目的大多数客户所使用的版本。

doc注释有点误导人——我提供的“doc”包装器是围绕R2007a中引入的并在所有后续版本中出现的doc命令的有意更改而工作的。为了让doc命令找到用户工具箱文档,这是必要的。我已经相应地改进了这个函数中的注释。

关注这个空间的更新很快!

若昂戴安娜

这看起来很整洁,但是我不能让它与R2008b一起工作。向后兼容性不是一个问题吗?至少在某种程度上——《2008b》并没有那么老(游戏邦注:我们是在2010年),我喜欢它作为一个稳定的平台;我不能每年都改变:)

更具体地说,一些例子使用了全新的“~ for未使用的参数”函数(这很容易修复),并且调用“feature”函数会导致错误“An unknown feature was specified”。
>>哪个特性
内置(无证)

总而言之,这似乎是一个很好的系统,我想尝试一下,但它似乎只针对最新的ML版本(这似乎很奇怪,因为它包含了一个“文档”替换,旨在修复R2007的问题)。

DNF

HButtonBox用于对齐文本的一个问题是,文本控件不能在自己的包围框内垂直对齐。因此HButtonBox调整文本uicontrol的大小,然后文本出现在其预期的位置之上。

也许使用一个swing文本控件修复了这个问题,但也许有可能使一些专门用于对齐文本的东西?

本Tordoff

嗨,费利克斯,

另一个想法-如果所有你想要的是中心的东西垂直或水平,HButtonBox和VButtonBox可能会帮助你。不要让名字误导你,这些可以布局任何小部件!它们允许对内容大小和对齐进行控制,而使用标准的盒子布局是很混乱的。

费利克斯

嗨,本,

谢谢你的提示。我有一种感觉,这可能是一个范围问题,并尝试将句柄分配给WS变量,这似乎只是解决方案的一半。尽管如此,我还是成功地用ui面板代替了空面板。

本Tordoff

嗨,费利克斯,

这是v1.3中修复的范围问题(目前正在等待批准)。在等待更新的同时,解决方案是保留空元素,这样它就不会超出作用域而被删除。"e = uiextras.Empty();setappdata(e,'MyObject',e)"会做的把戏(这是什么修复在幕后做的,它确保对象只在图形本身死亡时超出范围)。

对不起,希望修复的版本会很快出现在这里。

马格努斯

这正是我要找的!最后,可以制作一个漂亮的GUI。找到工具箱花了一些时间,谷歌“java layout matlab”给了一些有相同意图的人用java类型的布局生成gui。非常感谢Ben和这个工具箱的其他作者。

费利克斯

提交得很好,结构很好。还有很棒的文档。

我似乎在使用uiextra时遇到了问题。不过,清空。当我把空放在VBox或HBox中的其他子元素中,空从布局中消失,无论是当我添加更多的子元素,甚至当我得到(布局,' children ')。这并不是说它们没有被显示出来,它们实际上已经消失了,而且布局发生了变化。

完整的问题是,我试图将文本uicontrol垂直居中,通过将其放在VBox布局中,上面有一个空,下面有一个空。

大卫·桑普森

一个合理的要求,但目前不可能,因为这些不是内置的处理图形类。我们必须考虑是否有另一种合理的方法来提供专门化这些默认属性值的能力,而不会使API臃肿不堪。谢谢你的反馈。

达尼

这个贡献太棒了!非常容易使用,快速,可靠。

但有一个问题。当我使用标准用户界面对象时,我可以通过设置它们的默认值,例如set(0, 'DefaultUipanelBackgroundColor')。这个功能非常有用,因为它允许对GUI外观进行集中控制。是否有可能有相同的GUI布局工具箱,以便,例如,在BoxPanel的标准标题颜色可以设置为明亮的蓝色以外的东西?

本Tordoff

嗨,杰西,我理解你的痛苦——我自己过去也经历过类似的练习。

无论好坏,MATLAB对象系统是区分大小写的。虽然有(未记录的)方法使属性访问不区分大小写,但对象名称和方法始终是区分大小写的。使用不正确的大小写访问属性可能会慢5到10倍,很可能在遥远的将来,所有MATLAB对象、图形或其他都将因此变得区分大小写。

在我看来(无论是否谦虚),对于我的应用程序的用户来说,在转换代码的时候一次性的影响比永久的性能影响要好。我想这取决于变化的规模和用户的数量。

谢谢你的反馈,如果你发现了其他问题或有其他建议,请告诉我。

优秀的提交,非常功能丰富的布局编辑器。然而,我确实有一个挑剔的地方,那就是当使用set/get函数时,属性名是区分大小写的。这与图形句柄和其他matlab图形句柄的行为不同,并且在尝试将一些现有gui移植到使用此布局管理器时造成了一些困难。

本Tordoff

嗨负担,

使用此工具构建的gui绝对可以作为可执行应用程序部署,但你需要记住包括所使用的任何图标或其他资源(基本上是“+uiextras/ resources”文件夹中的东西)。我将添加一些文档来更详细地解释这一点。

这个工具箱只是在界面中布置小部件,而不是提供任何小部件,所以树并不适合。我过去使用内置的UITREE取得了一些成功,尽管它声称是实验性的。您还可以相当容易地将任何Java或ActiveX树小部件拉到MATLAB GUI中。我确实有一个增强的小部件工具箱,我将很快在这里发布,但不幸的是,其中没有树。

负担

看起来令人惊叹!

有可能很快看到对树对象的支持吗?金宝app

另外,使用此工具创建的gui是否可以使用matlab编译器编译成独立的应用程序?

马修·惠特克

完全聪明,易于使用。资料非常详尽。希望将来这能成为MATLAB核心的一部分。

到目前为止,我发现的唯一一件小事是下载中似乎没有layoutRoot函数

MATLAB版本兼容性
使用R2010a创建
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!