Matlab deploytool能否使用javax.swing元素编译文件?

Matlab deploytool能否使用javax.swing元素编译文件?,java,swing,matlab,matlab-compiler,Java,Swing,Matlab,Matlab Compiler,假设我有一组代码来显示JFrame、JPanel和JLabel。如果我将其作为脚本文件运行,则效果良好。它只是显示了一个小窗口,上面有一个标签,上面写着“一个标签”,与您预期的一模一样: frame = javax.swing.JFrame('Test'); panel = javax.swing.JPanel(); label = javax.swing.JLabel('A label'); panel.add(label); frame.add(panel); frame.setDefaul

假设我有一组代码来显示JFrame、JPanel和JLabel。如果我将其作为脚本文件运行,则效果良好。它只是显示了一个小窗口,上面有一个标签,上面写着“一个标签”,与您预期的一模一样:

frame = javax.swing.JFrame('Test');
panel = javax.swing.JPanel();
label = javax.swing.JLabel('A label');
panel.add(label);
frame.add(panel);
frame.setDefaultCloseOperation(javax.swing.JFrame.HIDE_ON_CLOSE);
frame.pack();
frame.setVisible(true);
当我使用deploytool将其编译为exe文件时,问题就出现了。它将编译,我可以运行程序,但帧将显示约3秒左右,然后消失。如果我从Matlab内部运行!main.exe,当窗口消失时没有错误消息(我不想说它崩溃了,因为没有错误消息)。如果我从Windows命令提示符运行可执行文件,也不会有结果(相同的结果——显示几秒钟,然后崩溃)

你知道这是怎么回事吗?我可以很好地编译其他文件。问题是因为我包含了javax.swing元素吗

非常感谢你的帮助

更新


这感觉像是一个非常便宜的黑客,但是只要JFrame打开,就有一个while循环暂停Matlab,这样做就可以了。所以现在的问题是,有没有更好的方法来实现这一点?

问题可能是您的主M代码函数完成了执行,并且由于没有数据,Matlab决定退出。在JavaSwing程序中,情况会一直持续下去,直到关闭所有Swing窗口或显式终止程序。由于这是一个Matlab程序,“处于控制中”的层是MatlabHandle图形层,因此您需要执行主函数或绘制图形。(在交互式Matlab中,只要打开IDE,它就会一直运行,但编译的Matlab程序中没有IDE,因此当它完成工作时,它就会退出。)

从MathWorks的角度来看,“正确的做法”可能是购买MatlabBuilder JA工具箱,将程序的Matlab部分构建到Java库中,并将其包含在用Java编写的主程序中。这样,Java层就“控制”了主执行序列,并且您所期望的“只要Java窗口打开就保持运行”逻辑将生效

如果你想破解它,使它在你当前的程序结构中工作,你的“看不见的图形”窗口可能是一个不错的窗口。尽管你需要让它可见才能工作;看不见的数字不算保持MatlabGUI运行。您可以通过更改其位置将其完全移出用户屏幕,从而对用户隐藏它

然后你需要以某种方式终止程序。代码的某些部分将知道程序何时结束。这听起来像是代码中的Java部分。从那里,您可以调用
java.lang.System.exit()
。如果你需要做Matlab层的工作,你可以通过将“该退出了”返回给你的Matlab代码,然后调用
exit()
或关闭该图来退出M-code。你可以通过在一个Java类中设置一个公共类变量来实现这一点,并且有一个Matlab
timer
对象,它每隔500毫秒左右检查一次该变量


如果程序结束的条件是所有Java Swing窗口都关闭,这就有点困难了。因为Matlab figure窗口本身是一个JavaAWT或Swing窗口,所以只要它是打开的,就不会出现零窗口。您可以做的是让Matlab
计时器
,而不是查找类变量,检查打开的Java窗口列表,看看Matlab图形是否是唯一剩下的图形,如果是,请关闭它或显式退出。

您是否检查了是否有任何错误被记录到类变量?或者如果你在Windows上显示崩溃转储,如果你在最后执行类似于暂停(30)的操作,或者创建一个常规的Matlab图形,会发生什么?我不熟悉编译器/部署工具,但我觉得Matlab方面的事情可能已经到了程序的末尾,将JVM拆掉并退出,因为它根本没有意识到它还有什么需要等待的(因为你已经在它背后直接创建了Swing对象)。当GUI关闭时,exe还在运行吗?我认为您部署了m-function finished,因此JVM是关闭的,而通过MatlabGUI JVM仍然是打开的。@这不是正确的。如果我暂停X秒,程序将运行X秒,然后停止。如果我创建一个Matlab图形窗口,程序将一直运行,直到我关闭窗口为止。我想制作一个不可见的图形来保持它的运行,但是没有办法终止可执行文件,是吗?看看文件交换上的“GUI布局工具箱”。它将为您提供更复杂的类似Swing的定制功能,同时仍然在M代码句柄图形级别进行编码。(一旦开始处理大量回调,这一点就更加重要了。)