2

我的目标是从“文件打开”对话框中选择一个文件,读取它并根据文件的内容绘制对象。我找到了一种打开该对话框的方法(请参见下面的框架代码),但是 PDE 程序在我可以选择文件之前开始绘制。由于绘图取决于所选文件的内容,因此出现空指针错误。

我的问题是如何在 draw 方法开始之前选择文件?

如果我在 setup() 中明确定义我的文件 (Amas.in),一切都很好,程序会根据给定文件显示我的输出。

如果我使用 selectInput(...),我只会在 draw() 启动后出现询问我文件名的对话框,从而导致指针错误。

如果我明确定义我的文件,然后调用 selectInput(...),程序会根据初始文件开始绘制对象,然后询问我想要哪个新文件;但是,在我选择新文件后,程序会忽略该新文件的内容。

默认的 Amas.in 和我的其他文件都在数据文件夹中。

我究竟做错了什么 ?

提前感谢您的任何建议。

String myInputFile ;

void setup() {

    selectInput("Select a file : ", "fileSelected");

    String[] lines = loadStrings("Amas.in");        // works
    //String[] lines = loadStrings(myInputFile);      // doesn't work

}

void draw() {

    ellipse(mouseX, mouseY, 9, 9);
    println("Selected at this point " + myInputFile);

}

void fileSelected(File selection) {

    if (selection == null) {
        myInputFile = "Amas.in" ;
        println("Default file is opened : " + myInputFile);
    } else {
        myInputFile = selection.getAbsolutePath() ;
        println("User selected " + myInputFile);
    }

}
4

2 回答 2

2

也许你可以检查你的文件是否在设置中加载,甚至在绘图时,我相信你想要在设置之外声明行,比如:

[代码编辑]

String [] myInputFileContents ;
String myFilePath;

void setup() {
  selectInput("Select a file : ", "fileSelected");
  while (myInputFileContents == null) {//wait
  }
}

void draw() {
  ellipse(mouseX, mouseY, 9, 9);
  println("Selected at this point " + myFilePath);
}

void mousePressed() {
  selectInput("Select a file : ", "fileSelected");
}

void fileSelected(File selection) {
    if (selection == null) {
    println("no selection so far...");
} else {

    myFilePath         = selection.getAbsolutePath();
    myInputFileContents = loadStrings(myFilePath) ;// this moves here...

    println("User selected " + myFilePath);
    }
}
于 2013-07-16T01:00:55.120 回答
1

vk 的解决方案是一个合适的解决方案,因为它使用了 Processing 中的预定义方法,并且由于它被允许运行而更好地简化了程序的生命周期,只是不显示任何内容。(几乎)相信所提供的框架而不是 hack 总是更好,但我会提供一个作为替代答案。如果您想在 setup() 运行之前弹出对话框,这将特别有用。

import javax.swing.*; 
String myInputFile ;

final JFileChooser fc = new JFileChooser(); 
int returnVal = fc.showOpenDialog(this); 
void setup() {

  if (returnVal == JFileChooser.APPROVE_OPTION) { 
    File file = fc.getSelectedFile(); 
    myInputFile = file.getAbsolutePath();
  } 
  else { 
    println("Cancelled.");
  }
}

void draw() {
  ellipse(mouseX, mouseY, 9, 9);
  println("Selected at this point " + myInputFile);
}
于 2013-07-16T10:56:16.723 回答