注意:我在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(),打印语句的顺序是
主要是从不绘制readLocFileAndDraw()的椭圆。
现在,我已将sleep()置于setup()方法中,以便控件保持在那里,现在代码流是
如果我超过睡眠时间,那么它与第一次没有睡眠的情况完全相同
内部发生了什么?我可以感觉到某些线程正在被调度但是如何控制它?有没有其他方法可以这样做?感谢。
答案 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