Matlab可以使用javax.swing元素deploytool编译文件吗?

假设我有一组代码来显示JFrame,JPanel和JLabel.如果我将其作为脚本文件运行,这可以正常工作.它只是显示一个带有标签的小窗口,上面写着“A label”,就像你期望的那样:

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秒左右然后消失.如果我使用!main.exe从Matlab内部运行,当窗口消失时没有错误消息(我不想说它崩溃,因为没有错误消息).如果我从Windows命令提示符运行可执行文件,也没有一个(相同的结果 – 显示几秒钟然后崩溃).

有什么想法在这里发生了什么?我可以编译其他文件就好了.问题是因为我包含了javax.swing元素吗?

非常感谢您的帮助.

UPDATE

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

最佳答案 问题可能是你的主要M代码函数完成了执行,并且由于没有数字,Matlab决定退出.在Java Swing程序中,会发生什么事情会一直持续到所有Swing窗口关闭或您明确终止程序.由于这是一个Matlab程序,“控制”层是Matlab句柄图形层,因此您需要执行主函数或计算. (在交互式Matlab中,只要你有IDE,它就会继续运行,但是在编译的Matlab程序中没有IDE,所以当它的工作完成后,它会退出.)

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

如果你想破解它以使其在你当前的程序结构中工作,你的隐形图窗口可能是一个很好的.虽然你需要让它可见才能让它工作;隐形数字不计入运行Matlab GUI.您可以通过更改其位置将其完全移出用户屏幕来将其隐藏起来.

然后你需要以某种方式终止程序.代码的某些部分将知道程序何时结束.这听起来像是代码中的Java部分.从那里,你可以调用java.lang.System.exit().如果你需要做Matlab层的东西,你可以通过将“退出时间”传回你的Matlab代码退出M代码,然后可以调用exit()或关闭那个数字.您可以通过在其中一个Java类中设置公共类变量来实现此目的,并且具有一个每500毫秒左右检查一次该变量的Matlab计时器对象.

如果结束程序的条件是所有Java Swing窗口都关闭,那就更难了.因为Matlab图形窗口本身是一个Java AWT或Swing窗口,所以只要它打开你就不会达到零窗口.您可以做的是使用Matlab计时器,而不是查找类变量,检查打开的Java窗口列表,看看Matlab图是否是唯一剩下的,如果是,请关闭它或明确退出.

点赞