2013-07-15 117 views
2

我的目標是從「文件打開」對話框中選擇一個文件,閱讀和借鑑基於文件的內容對象 。 我找到了打開該對話框的方法(請參閱下面的框架代碼),但是PDE程序啓動 之前我可以選擇文件。由於圖形取決於所選文件的 內容,因此我收到空指針錯誤。處理2.0 - 打開文件對話框

我的問題是如何在繪製方法開始之前選擇文件?

如果我在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); 
    } 

} 

回答

2

也許你可以檢查你的文件被加載在安裝,甚至在平局,我也相信你想要的行外設置,索姆東西一樣的聲明:

[CODE EDITED]

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); 
    } 
} 
+0

感謝您的反饋! – Eric

+0

感謝您的反饋!問題是,那就是問題,程序不會等待對話框的答案繼續,所以如果myInputFile爲null,則會出現錯誤。瞭解我的意思的最好方法是創建一個包含兩個文件(Amas3d.in和另一個文件)的數據文件夾,其內容與此骨架代碼無關並運行它。事實是draw()在對話框的結果已知之前就開始了。進行抽獎測試會浪費CPU。在運行draw()之前,必須有一種方法來等待對話框的答案。我知道的所有其他語言都這樣做。 – Eric

+0

在這裏,現在我想我理解你,你需要考慮兩個不同的東西,filePath和fileContents。我再次編輯上面的代碼,檢查出來; –

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); 
} 
+0

感謝您的反饋,這將在Processing中工作嗎?我更喜歡在setup()中打開對話框。正如我上面寫的,不管對話框的結果如何,draw()都會啓動。除非我在打開對話框之前明確地定義了myInputFile(哪個起作用),否則會出現錯誤。如果我在對話框中輸入一個新的文件名,它將不會被考慮,因爲那時draw()已經在運行。 – Eric

+0

它確實有效!與「selectInput(」選擇文件:「,」fileSelected「);」相反,此對話框在運行draw()之前實際上會等待我的輸入。這就是我想要的,謝謝彼得羅斯! – Eric

+0

歡迎您!您始終可以在setup()中移動JFileChooser,它的工作方式也是一樣!另外,不要忘記接受答案! –