我已经构建了这3个应用程序。他们每个人都从用户输入收集数据并创建一个csv文件。其中2个依赖于LEAP运动控制器。我试图想出一种方法将它们组合成一个程序。关于如何做到这一点的任何提示?我可以将它们封装成一个类,然后让主程序分别调用它们吗?或者我是否需要进入并重新组合一起工作?每个应用程序使用draw()与所有类型的标志非常不同,noLoop()和Loop()调用在必要时暂停以收集数据,因此将所有重写为1都很困难。此外,代码目前的形式非常草率。我基本上已经砍掉并拉出了randoms位以让每个人做我需要做的事情。每一个都是混乱,所以将所有这些组合成一个程序似乎是一个真正的噩梦。
是否有包装它们以便一端自动打开?有点像在网页中你可以如何链接或在关闭后自动打开另一个页面?每个应用程序只需运行一次,所以我不必担心来回走动。
最终,我将构建一个可视化,可以使用这些应用程序中的数据实时更新。我想我可以为该部分构建一个Web应用程序,因为我希望能够从多个位置/平台查看可视化。
我已经在所有代码中添加了一个Dropbox链接。有人建议使用Swing接口将应用程序直接嵌入到Java中。现在我正在阅读this,我认为这是在解释如何做到这一点。我之前从未使用过Java Swing,所以我现在迷路了......
答案 0 :(得分:3)
关于实施真的有很多问题......你想要一个大应用程序还是你也想要它们作为不同的应用程序?您想运行三个已完成的应用程序,还是要组合源代码?您也可以将它们放入库中......关于您在其他问题(Create more than one window of a single sketch in 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++;
}
}
然后,控制器类只是here中我的答案的修改。这是它的代码:
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()一起使用”。这是由setup()
方法中的startApplet()
调用引起的,这是一个并发问题,因此需要更深入的思考和知识......作为一个临时措施,我从一个调用setup()
thread ...如果你不打算重复这个过程,那么整个线程就没有必要了,你不需要每次都setup()
。
P.S。这是一个hacky-slashy解决方案...我的建议是将您的草图合并为一个并正确地执行...
答案 1 :(得分:2)
简单的解决方案:只需制作批处理文件并为每个应用程序添加一行。让一个人等待下一个电话,如下所示:
START /WAIT MyApp1.exe
START /WAIT MyApp2.exe
START /WAIT MyApp3.exe
答案 2 :(得分:1)
看看http://www.onar3d.com/mother/
这是一个VJ库,它将一堆小草图组合成一个表演。您将不得不为每个草图添加一些代码以便他们进行交谈,您需要编写一个简短的草图来对草图进行排序。
所有应用程序都将存在于一个处理草图中,因此您不会关闭一个应用程序和窗口,然后打开下一个应用程序和窗口,这将是一个无缝的体验。如果不太理想,那么@ krowe的解决方案简单可靠。