java - 将处理应用程序组合成一个大的可执行文件?

标签 java swing processing

我已经构建了这 3 个应用程序。他们每个人都从用户输入中收集数据并创建一个 csv 文件。其中 2 个依赖于 LEAP 运动 Controller 。我正在尝试找出一种将它们全部组合成一个程序的方法。关于我如何去做这件事的任何提示?我可以将它们像一个类一样封装起来,然后让主程序分别调用它们吗?或者我需要进去重写所有东西才能一起工作吗?每个应用程序对 draw() 的所有类型的标志和 noLoop() 和 Loop() 调用的使用都非常不同,以根据需要暂停以收集数据,因此将所有重写为 1 将很困难。此外,代码在当前形式下非常草率。我基本上是砍掉了随机数位,让每个人都做我需要做的事情。每一个都是一团糟,所以将所有这些组合到一个程序中似乎是一场真正的噩梦。

有没有办法把它们打包成一个结束另一个自动打开?有点像在一个网页中你如何可以在一个页面关闭后链接或自动打开另一个页面?每个应用程序只需要运行一次,所以我不必担心来回。

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

我已经包含了所有代码的保管箱链接。有人建议使用 Swing 接口(interface)将应用程序直接嵌入到 Java 中。现在我正在阅读this我认为这是在解释如何去做。我以前从未使用过 Java Swing,所以我现在迷路了....

Reference link

最佳答案

确实有很多关于实现的问题...您是只想要一个大应用程序还是还想要它们作为不同的应用程序?三个成品的app你是想运行,还是想合并源码?您也可以将它们制作成库...关于您在另一个问题 (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); , 它们都可以用作适当的草图。然后我将这两个代码放在 Controller 草图的不同选项卡中,并将它们包装到这样的类中:

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++;
  }
}

然后, Controller 类只是我在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++;
  }
}

简而言之,从三个草图(所有选项卡)中获取所有代码,将它们放入 Controller 草图中的新选项卡中,并用扩展 PApplet 的类包装。

不幸的是,除非您修改代码,否则您不能在 Controller 草图中拥有三个草图的选项卡。在接下来的修改示例中,只有 lala1() 和 lala3() 在蓝色窗口中。 lala2() 在 Controller 窗口中...

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 和奇怪的错误消息,例如“缺少与 popMatrix() 一起使用的 pushMatrix()”。这是由 setup() 引起的调用startApplet()方法,这是一个并发问题,因此需要更深入的思考和知识...作为临时措施,我将其称为setup()从一个线程...如果你不打算重复这个过程,那么整个线程就没有必要了,你也不需要 setup()每次.!

附言这是一个 hacky-slashy 解决方案...我的建议是将您的草图合并为一个并正确地完成...

关于java - 将处理应用程序组合成一个大的可执行文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21437922/

相关文章:

java - 无法更改 JFrame ContentPane 的背景颜色

java - task scheduler run .exe问题(.exe包含处理java代码)

java - 没有 block 处理的Spring Batch步骤

java - 处理我的 Sprite 不会移动

java - 辅助服务店面登录不起作用

java - 可以将 Intent 的 startActivityForResult() 中使用的请求代码用作常规变量吗?

java - Java 中的 Unicode 字符

java - 创建 Intellij IDEA 插件。存储插件设置

java - Swing 代码复制标签和文本

java - 导出 Swing 应用程序后没有图标