将处理应用程序组合成1个大型可执行文件?

我已经构建了这3个应用程序。 他们每个人都从用户输入收集数据并创建一个csv文件。 其中2个依赖于LEAP运动控制器。 我试图想出一种方法将它们组合成一个程序。 关于如何做到这一点的任何提示? 我可以将它们封装成类,然后让主程序分别调用它们吗? 或者我是否需要进入并重新组合一起工作? 每个应用程序使用draw()与所有类型的标志非常不同,noLoop()和Loop()调用在必要时暂停以收集数据,因此将所有重写为1都很困难。 此外,代码目前的forms非常草率。 我基本上已经砍掉并拉出了randoms位以让每个人做我需要做的事情。 每一个都是混乱,所以将所有组合成一个程序似乎是一个真正的噩梦。

反正是否有包装它们一端另一端自动打开? 有点像在网页中你可以如何链接或在关闭后自动打开另一个页面? 每个应用程序只需运行一次,所以我不必担心来回走动。

最终,我将构建一个可视化,可以使用这些应用程序中的数据实时更新。 我想我可以为该部分构建一个Web应用程序,因为我希望能够从多个位置/平台查看可视化。

我已经包含了所有代码的Dropbox链接。 有人建议使用Swing接口将应用程序直接嵌入到Java中。 现在我正在阅读这篇文章 ,我认为这是在解释如何去做。 我之前从未使用过Java Swing,所以我现在迷失了……

参考链接

实际上有很多关于实现的问题……你想要一个大应用程序还是你想要它们作为不同的应用程序? 您想运行三个已完成的应用程序,还是要组合源代码? 您也可以将它们放入库中……关于您在另一个问题中的注释( 在Processing中创建一个草图的多个窗口 ),当然可以创建另一个PApplet来存储您的应用程序。 我稍微修改了一下这个例子来展示。

在这里,我创建了两个草图RedBG和BlueBG,如下所示:

int counter = 0; public void setup() { size(400, 400); counter = 0; } public void draw() { background(255, counter, counter); fill(255-counter); text(String.valueOf(counter), width*0.5, height*0.5, width, height); counter++; } 

这是红色的,蓝色的有background(counter, counter, 255); ,它们都是正确的草图。 然后我拿了两个代码并将它们放在控制器草图中的不同选项卡中,并将它们包装成如下所示的类:

 public class RedBG extends PApplet { int counter = 0; public void setup() { size(400, 400); counter = 0; } public void draw() { background(255, counter, counter); fill(255-counter); text(String.valueOf(counter), width*0.5, height*0.5, width, height); counter++; } } 

然后,控制器类只是我在这里的答案的修改。 这是它的代码:

 import javax.swing.*; PApplet r, b; PFrame rf, bf; String nextWindow = "red"; int controllerCounter = 200; String control = "preparing..."; void setup() { size(400, 400); r = new RedBG(); b = new BlueBG(); frame.setTitle("controller"); fill(0); } void draw() { background(255); if (controllerCounter < 1) { switchState(); controllerCounter = 200; } control = null; control = "Launching " + nextWindow + " in: " + controllerCounter; text(control, width*0.5, height*0.5, width, height); controllerCounter--; } void switchState() { if (nextWindow == null) { stopApplet(b); nextWindow = "red"; } else if (nextWindow.equals("red")) { startApplet(r); nextWindow = "blue"; } else if (nextWindow.equals("blue")) { stopApplet(r); startApplet(b); nextWindow = null; } } void startApplet(final PApplet p) { if (p == null) return; final PFrame f = new PFrame(p); p.frame = f; f.setTitle(p.getClass() + " window"); //this thread is only necessary if you are restarting the PApplets Thread t = new Thread(new Runnable() { public void run() { p.setup(); } }); t.run(); } void stopApplet(PApplet p) { if (p == null || p.frame == null) return; p.dispose(); p.frame.dispose(); } public class PFrame extends JFrame { public PFrame(PApplet p) { setSize(400, 400); add(p); p.init(); show(); } } 

草图中的两个类是:

 public class BlueBG extends PApplet { int counter = 0; public void setup() { size(400, 400); counter = 0; } public void draw() { background(counter, counter, 255); fill(255-counter); text(String.valueOf(counter), width*0.5, height*0.5, width, height); counter++; } } 

和:

 public class RedBG extends PApplet { int counter = 0; public void setup() { size(400, 400); counter = 0; } public void draw() { background(255, counter, counter); fill(255-counter); text(String.valueOf(counter), width*0.5, height*0.5, width, height); counter++; } } 

简而言之,从三个草图(所有选项卡)中获取所有代码,将它们放在控制器草图中的新选项卡中,并使用扩展PApplet的类进行换行。

遗憾的是,除非您修改代码,否则您无法在控制器草图中显示三个草图的选项卡。 在随后的修改后的样本中,只有lala1()和lala3()位于蓝色窗口中。 lala2()在控制器窗口中...

 public class BlueBG extends PApplet { int counter = 0; public void setup() { size(400, 400); counter = 0; } public void draw() { background(counter, counter, 255); fill(255-counter); text(String.valueOf(counter), width*0.5, height*0.5, width, height); counter++; lala1(); lala2(); lala3(this); } public void lala1() { fill(255, 255, 0); ellipse(100, 100, 100, 100); } } public void lala2() { fill(255, 0, 255); ellipse(150, 150, 100, 100); } public void lala3(PApplet p) { p.fill(0, 255, 255); p.ellipse(200, 200, 100, 100); } 

最后但并非最不重要的是,有时代码会抛出NullPointerException和奇怪的错误消息,例如“在后台方法调用中缺少pushMatrix()以与popMatrix()一起使用”。 这是由startApplet()方法中的setup()调用引起的,这是一个并发问题,因此需要更深入的思考和知识......作为一个临时措施,我从一个线程调用setup() ...如果你不会重复这个过程,那么整个线程就没有必要,而且你不需要每次都setup()

PS这是一个hacky-slashy解决方案...我的建议是将您的草图合并为一个并正确地执行...

简单的解决方案:只需制作批处理文件并为每个应用程序添加一行。 让一个人等待下一个电话,如下所示:

 START /WAIT MyApp1.exe START /WAIT MyApp2.exe START /WAIT MyApp3.exe 

看看http://www.onar3d.com/mother/这是一个VJ库,它将一堆小草图结合到一个表演中。 您将不得不为每个草图添加一些代码以便他们进行交谈,您需要编写一个简短的草图来对草图进行排序。

所有应用程序都将存在于一个处理草图中,因此您不会关闭一个应用程序和窗口,然后打开下一个应用程序和窗口,这将是一个无缝的体验。 如果不太理想,那么@ krowe的解决方案简单可靠。