在 matlab 中获取控件的基础 java 组件的快速方法
Fast way to obtain underlying java component for controls in matlab
我想获得对 GUI 中控件的基础 java 组件的引用,以便自定义它们的外观。
我从 Yair Altman 那里了解到 findjobj,效果非常好:
myLink = uicontrol('String', '<html><u>Button that looks like a link.</u></html>');
jObj = findjobj(myLink);
jObj.setContentAreaFilled(0);
不幸的是,当有 "lot" 控件需要自定义时,这个解决方案 相当慢 (因为它必须解析图中对象的完整层次结构,而这为每个控件定制)。
此外,图形必须是可见的(否则控件不会被实例化并且无法找到 java 引用)。另外,当 findjobj
为 运行 时,它必须从屏幕上移开以避免用户触摸它(有时会使事情崩溃,因为 findjobj
以某种方式依赖控件的位置来找到它们,同时在内部调用 drawnow
更新位置)...
在某些机器上,即使只有几个控件可以自定义,也可能需要长达 10 秒才能显示图形(大部分时间都花在 findjobj
上)。
我也从 Yair Altman 那里再次了解 uicomponent 直接创建控件并获取底层 java 组件的句柄一枪:
[myLink, jObj] = uicomponent('Style', 'JButton', 'String', '<html><u>Button that looks like a link.</u></html>');
jObj.setContentAreaFilled(0);
不幸的是,这里的 parent 属性 只能是一个数字 当然我的控件放在 gui layout 容器中以处理调整大小和许多其他事情很好(并且 gui 布局容器不是 uicomponent 工作的有效 hg-handles)...
所以想知道是否有任何其他 快速解决方案 来获取我的 GUI 中控件的基础 java 组件? ... 注意:我主要只需要看起来像超链接或动画 gif 的按钮(即内部带有 htlm text/img 的无边框按钮)。
这不是您问题的直接答案,但我构建了几个基于 GUI 布局工具箱并包含 Java swing 组件的 GUI。我通常会安排一些事情,以便 GUI 布局容器(HBox
、VBox
、Grid
等)具有 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 提到的,我的书中都讨论了这些...
我想获得对 GUI 中控件的基础 java 组件的引用,以便自定义它们的外观。
我从 Yair Altman 那里了解到 findjobj,效果非常好:
myLink = uicontrol('String', '<html><u>Button that looks like a link.</u></html>'); jObj = findjobj(myLink); jObj.setContentAreaFilled(0);
不幸的是,当有 "lot" 控件需要自定义时,这个解决方案 相当慢 (因为它必须解析图中对象的完整层次结构,而这为每个控件定制)。
此外,图形必须是可见的(否则控件不会被实例化并且无法找到 java 引用)。另外,当
findjobj
为 运行 时,它必须从屏幕上移开以避免用户触摸它(有时会使事情崩溃,因为findjobj
以某种方式依赖控件的位置来找到它们,同时在内部调用drawnow
更新位置)...在某些机器上,即使只有几个控件可以自定义,也可能需要长达 10 秒才能显示图形(大部分时间都花在
findjobj
上)。我也从 Yair Altman 那里再次了解 uicomponent 直接创建控件并获取底层 java 组件的句柄一枪:
[myLink, jObj] = uicomponent('Style', 'JButton', 'String', '<html><u>Button that looks like a link.</u></html>'); jObj.setContentAreaFilled(0);
不幸的是,这里的 parent 属性 只能是一个数字 当然我的控件放在 gui layout 容器中以处理调整大小和许多其他事情很好(并且 gui 布局容器不是 uicomponent 工作的有效 hg-handles)...
所以想知道是否有任何其他 快速解决方案 来获取我的 GUI 中控件的基础 java 组件? ... 注意:我主要只需要看起来像超链接或动画 gif 的按钮(即内部带有 htlm text/img 的无边框按钮)。
这不是您问题的直接答案,但我构建了几个基于 GUI 布局工具箱并包含 Java swing 组件的 GUI。我通常会安排一些事情,以便 GUI 布局容器(HBox
、VBox
、Grid
等)具有 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 提到的,我的书中都讨论了这些...