2014-02-20 34 views
4

假设我有一组代码来显示JFrame,JPanel和JLabel。如果我将它作为脚本文件运行,这工作正常。它只是显示一个小窗口,一个标签,上面写着“标签”就像你所期望的:Matlab可以使用javax.swing元素来部署文件吗?

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

这感觉就像一个非常便宜破解,但有一个while循环,只要是的JFrame开放,即暂停Matlab的做的伎俩。所以现在的问题是,有没有更好的方法来做到这一点?

+0

您是否检查过是否有任何错误记录到[Java控制台](http://www.java.com/en/download/help/javaconsole.xml)?或者如果您遇到崩溃转储 - 无论那些在Windows上显示的地方。 – horchler

+1

如果你在最后做了'暂停(30)',或者还创建了一个常规的Matlab图形,会发生什么?我对编译器/ deploytool不熟悉,但它让我感到Matlab的一面可能已经到达了程序的终点,拆除了JVM并退出,因为它根本没有意识到它有任何东西需要等待(因为你已经背后,直接创建Swing对象)。 – Notlikethat

+0

当GUI关闭时,exe是否仍在运行?我认为你部署了m函数,因此JVM关闭,而通过matlab GUI,JVM保持打开状态。 – Daniel

回答

2

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

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

如果你想破解它以使其在当前的程序结构中工作,那么你的隐形数字窗口可能是一个不错的选择。尽管你需要让它看起来有效,看不见的数字不能保证Matlab GUI的运行。您可以通过改变位置将其从用户的屏幕上完全移开,从而将其隐藏起来。

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

如果程序结束的条件是所有的Java Swing窗口都关闭了,那有点困难。由于Matlab图形窗口本身是一个Java AWT或Swing窗口,所以只要这个窗口打开,你就不会进入零窗口。你可以做的是有Matlab timer,而不是寻找一个类变量,检查打开的Java窗口列表,看看是否只剩下一个Matlab图形,如果是,关闭它或明确退出。

相关问题