处理语言如何在内部工作?

时间:2017-10-23 20:43:20

标签: processing data-visualization

注意:我在Eclipse上使用处理jar(core.jar)。

实际上我想让用户上传每个行中具有城市名称和位置(纬度和长坐标)的位置文件。 locFileSelected()是一个回调方法,一旦用户选择文件就会调用它。

从上面的回调方法,控制转到另一个类(DrawOnCanvas)方法readLocFileAndDraw(),它执行IO并从中创建Hashmap。此地图用于迭代和绘制每个城市的点数。

为了确保,我在setup()方法中绘制了圆圈并且它完美地运行。我将解释为什么我在解释DrawOnCanvas类之后使用sleep()。

import java.io.File;

import processing.core.PApplet;

public class TestingProcessing extends PApplet{

    String locFilePath;
    public static void main(String[] args) {
        // Applet of Processing language
        PApplet.main("TestingProcessing");
    }

    public void settings() {
        size(800,900);
    }

    public void setup() {
        background(255);

        // Just a sample ellipse, it is drawn properly.
        stroke(0);
        fill(0);
        ellipse(500,500,25,25);

        selectInput("Select a file for Locations:", "locFileSelected"); 
        // This will send control to call back method locFileSelected()

        try {
            Thread.sleep(10000); //10 sec
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("In setup()");
    }

    public void locFileSelected(File locFile) {

        // I can't draw anything here too, I tried it

        locFilePath = locFile.toString();
        DrawOnCanvas draw = new DrawOnCanvas(this, locFilePath);
        draw.readLocFileAndDraw();
        System.out.println("In callback()");
    } 


}

下面这个文件有IO,我想在这个文件中为每个城市绘制点数。在这个类的构造函数中,我已经传递了文件路径,因此可以分别完成IO。在readLocFileAndDraw()中,为了演示,我还没有完成IO,也没有创建Map。相反,我刚刚硬编码了一个椭圆。

import processing.core.PApplet;

public class DrawOnCanvas{

    PApplet parent;
    String locFilePath;

    DrawOnCanvas(){ }

    DrawOnCanvas(PApplet p, String locFilePath){
        parent = p;
        this.locFilePath = locFilePath;
    }

    /**
     * Reading the locations file and storing them in map 
     * @param locationsMap - Hash Map for the locations of each city in locations file
     */
    public void readLocFileAndDraw() {

        // Actually I create map here by doing Java IO for reading file
        // I iterate each line and put in a map so that for each entry, I can
        // draw a point on canvas

        parent.stroke(0);
        parent.fill(0);
        parent.ellipse(200,200,15,10);

        // Instead of reading from map which I have to do actually, I have hard-coded everything.


    }
}

现在,在调试时我注意到一旦用户获得浏览文件的提示,setup()方法的控制就会消失。例如,没有sleep(),打印语句的顺序是

  • 在setup()中(首先打印然后用户得到提示)
  • 在callback()中(在用户选择位置文件后打印)

主要是从不绘制readLocFileAndDraw()的椭圆。

现在,我已将sleep()置于setup()方法中,以便控件保持​​在那里,现在代码流是

  • 用户获取提示,他选择文件
  • “在回调()中打印了
  • 10秒的总睡眠时间结束,然后打印“在设置()中”以及readLocFileAndDraw():)中定义的椭圆。

如果我超过睡眠时间,那么它与第一次没有睡眠的情况完全相同
内部发生了什么?我可以感觉到某些线程正在被调度但是如何控制它?有没有其他方法可以这样做?感谢。

1 个答案:

答案 0 :(得分:1)

首先,在不同的类中使用回调函数似乎有点奇怪。它可能会起作用,但它会带来很多奇怪之处:如果你有两个具有readLocFileAndDraw()函数的类会怎么样?所以我建议的第一件事就是简化你的设计并直接在TestingProcessing类中使用回调函数。

其次,拥有一个no-args DrawOnCanvas构造函数似乎也很奇怪。在这种情况下,parent的值将为null,当您尝试使用NullPointerException时,这将导致draw()。处理是在幕后使用反射,所以你必须非常小心这种事情。

最后,您可能尝试的另一件事是在回调函数中设置一些变量并使用float x = 0; float y = 0; void setup() { selectInput("Select a file.", "fileSelected"); } void draw(){ background(64); ellipse(x, y, 20, 20); } void fileSelected(){ x = 50; y = 50; } 函数中的变量。像这样的东西:

c