假设我有一组代码来显示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元素吗?
非常感谢你的帮助。
更新
这感觉就像一个非常便宜的黑客,但只要JFrame打开就有一个暂停Matlab的while循环就可以了。所以现在的问题是,有更好的方法吗?
答案 0 :(得分:2)
问题可能是你的主要M代码函数完成执行,并且由于没有数字,Matlab决定退出。在Java Swing程序中,会发生什么事情会一直持续到所有Swing窗口关闭或您明确终止程序。由于这是一个Matlab程序,因此控制" s"是Matlab处理图形层,因此您需要执行主函数或计算。 (在交互式Matlab中,只要你有IDE,它就会继续运行,但是在编译的Matlab程序中没有IDE,所以当它的工作完成后,它会退出。)
"正确的事情"从MathWorks'做透视图可能是购买Matlab Builder JA工具箱,将程序的Matlab部分构建到Java库中,包含在用Java编写的主程序中。这样,Java层就可以控制"主要的执行顺序,只要有Java窗口打开,"就会保持运行状态。你期待的逻辑将会生效。
如果你想破解它以使它在你当前的程序结构中工作,你的隐形图窗口可能是一个很好的。虽然你需要让它可见才能让它工作;无形的数字并不能保证Matlab GUI的运行。您可以通过更改其位置将其完全移出用户的屏幕来将其隐藏起来。
然后你需要以某种方式终止程序。代码的某些部分将知道程序何时结束。这听起来像是代码中的Java部分。从那里,你可以打电话给java.lang.System.exit()
。如果你需要做Matlab层的东西,你可以通过传达"它退出"的时间退出M代码。回到您的Matlab代码,然后可以调用exit()
或关闭该数字。您可以通过在其中一个Java类中设置公共类变量来实现此目的,并使用一个Matlab timer
对象每500毫秒左右检查一次该变量。
如果结束程序的条件是所有Java Swing窗口都关闭,那就更难了。因为Matlab图形窗口本身就是一个Java AWT或Swing窗口,所以只要打开它你就不会达到零窗口。您可以做的是使用Matlab timer
,而不是查找类变量,检查打开的Java窗口列表,看看Matlab图是否是唯一剩下的,如果是,请关闭它或明确退出