在 matlab 中获取控件的基础 java 组件的快速方法

Fast way to obtain underlying java component for controls in matlab

我想获得对 GUI 中控件的基础 java 组件的引用,以便自定义它们的外观。

所以想知道是否有任何其他 快速解决方案 来获取我的 GUI 中控件的基础 java 组件? ... 注意:我主要只需要看起来像超链接或动画 gif 的按钮(即内部带有 htlm text/img 的无边框按钮)。

这不是您问题的直接答案,但我构建了几个基于 GUI 布局工具箱并包含 Java swing 组件的 GUI。我通常会安排一些事情,以便 GUI 布局容器(HBoxVBoxGrid 等)具有 uipanel 作为 child,然后是 uipanel 具有 Java 摇摆组件作为 child。

您通常可以 parent 将 Java 组件添加到 uipanel 中,其方式与 parent 将其添加到图形中的方式完全相同(与 GUI 布局容器不同) , parent 一个 uipanel 到 GUI 布局容器是没问题的。

所以,例如,要添加一个带有下拉菜单的按钮(没有菜单项,所以它不会做任何事情,只是为了说明):

>> u = uipanel;
>> ddbuttonclass = 'com.mathworks.widgets.DropdownButton';
>> ddbutton = javaObjectEDT(ddbuttonclass);
>> [jddbutton, hjddbutton] = javacomponent(ddbutton, [30,30, 60, 30], u);

现在您可以 parent u 到 GUI 布局容器,并且可以很好地调整大小。

我对 Yair 的 uicomponent 不是很熟悉,但是如果你能以某种方式获得 java 组件的句柄,你应该能够使用类似上面的东西。

PS 如果你想要他的直接输入,@Yair 有时会在 SO 上活跃 - 如果我提到他的名字,他可能会收到通知。如果您正在做很多 Java/MATLAB GUI 工作,我还建议您购买他的 book.

UICOMPONENT 旨在直接替代 Matlab 的内置 UICONTROL 和 JAVACOMPONENT 函数。这意味着您可以直接将 UICOMPONENT 放置在面板中,即使是那些由 GUI 布局工具箱创建的面板。

在某些 Matlab 版本中,您可能需要将布局面板的句柄转换为双倍 (double(hPanel)),仅此而已:

[myLink, jObj] = uicomponent('Parent',hPanel, ...);
[myLink, jObj] = uicomponent('Parent',double(hPanel), ...);  % on some Matlab releases

您也可以直接使用 JAVACOMPONENT,但与 UICOMPONENT 相比,它并没有给您带来任何好处,因为 UICOMPONENT 在底层使用 JAVACOMPONENT 并且还添加了重要的功能(例如确保组件放置在 EDT 上,并且合并来自 Matlab 包装器的重要属性)。

至于 FINDJOBJ,您可以通过使用 'class' 参数指定目标对象 class 来加快速度。但是,如果您的图形包含数百个控件,它可能仍然很慢。直到今天,在我的第一个 FINDJOBJ 版本发布将近 10 年之后,我仍然不知道获取底层 Java 对象的直接方法。我假设 MathWorks 内部使用了一个,但我不知道。

正如@SamRoberts 提到的,我的书中都讨论了这些...