在单独的循环上提取draw()方法(PApplet作为JADE代理)

时间:2013-11-12 04:27:56

标签: java multithreading processing agents-jade

我正在Java上创建一个基于JADE的代理系统,我想使用Processing来可视化这些代理。现在JADE框架在它自己运行,并且Processing PApplet被实例化为代理之一,它是一个单例。

每次(其他类型的)代理之一发生更改时,它们都会调用PApplet的redraw()方法。问题是,PApplet没有调用它的draw()方法,因为它没有在它自己的线程上运行。

我该如何解决这个问题?

编辑:

public class Manager extends Agent{
        //The Agent object that runs as a separate thread under JADE framework.
        protected void setup(){
                ...
                javax.swing.SwingUtilities.invokeLater(new VisualizerThreadRunnable(this));
                ...
        }
}
class VisualizerThreadRunnable implements Runnable {
        public VisualizerThreadRunnable(Manager m){
                  ...
        }
        public void run(){
                System.out.println("visualizer being launched...");
                Visualizer visualizer = new Visualizer(manager);
                visualizer.setVisible(true);
        }
}

public class Visualizer extends PApplet {
        //from examples on http://processing.org/tutorials/eclipse/
        public Visualizer(Manager m){
                this.m = m;
                ...
        }
        public void setup() {
                size(200,200);
                background(0);
        }

        public void draw() {
                stroke(255);
                if (mousePressed) {
                        line(mouseX,mouseY,pmouseX,pmouseY);
                }
        }
}

1 个答案:

答案 0 :(得分:1)

在可视化工具线程中,您还需要使用init()初始化PApplet:

 public void run(){
                System.out.println("visualizer being launched...");
                Visualizer visualizer = new Visualizer(manager);
                visualizer.init();//This is pretty important
                visualizer.setVisible(true);
        }

有关结帐PApplet's javadocs的更多信息。

这应解决问题的处理方面。我之前从未使用过Jade, 所以我不知道线程是否会继续存在。检查是否发生这种情况,如果没有,也许你应该保持该线程运行。