2

私の目標は、「ファイルを開く」ダイアログ ボックスからファイルを選択し、それを読み取り、ファイルの内容に基づいてオブジェクトを描画することです。そのダイアログ ボックスを開く方法を見つけましたが (以下のスケルトン コードを参照)、ファイルを選択する前に PDE プログラムが描画を開始します。描画は選択したファイルの内容に依存するため、null ポインター エラーが発生します。

私の質問は、描画メソッドが開始される前にファイルを選択するにはどうすればよいですか?

ファイル (Amas.in) を setup() で明示的に定義すると、すべて問題なく、プログラムは指定されたファイルに基づいて出力を表示します。

selectInput(...) を使用すると、draw() が開始された後にのみファイル名を尋ねるダイアログ ボックスが表示され、ポインター エラーが発生します。

ファイルを明示的に定義してから selectInput(...) を呼び出すと、プログラムは最初のファイルに従ってオブジェクトの描画を開始し、どの新しいファイルが必要かを尋ねます。ただし、新しいファイルを選択すると、プログラムはその新しいファイルの内容を無視します。

デフォルトの Amas.in と他のファイルの両方が data フォルダーにあります。

私は何を間違っていますか?

アドバイスをよろしくお願いします。

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

1

vk による解決策は、Processing で定義済みのメソッドを使用するため、適切な解決策です。何も表示しないだけで、実行が許可されているため、プログラムの寿命が長くなります。ハックするのではなく、提供されたフレームワークを信頼する方が (ほぼ) 常に優れていますが、別の回答として提供します。これは、 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 に答える