2013-07-15 4 views
2

Моя цель - выбрать файл из диалогового окна «открыть файл», прочитать его и нарисовать объекты на основе содержимого файла. Я нашел способ открыть это диалоговое окно (см. Код скелета ниже), однако программа PDE запускается рисунок ПЕРЕД Я могу выбрать файл. Поскольку чертеж зависит от содержимого выбранного файла, я получаю ошибку с нулевым указателем.Обработка 2.0 - Открыть диалог с файлом

Мой вопрос в том, как я могу выбрать файл до начала метода рисования?

Если я определяю свой файл (Amas.in) явно в setup(), все хорошо, программа показывает мой вывод на основе данного файла.

Если я использую 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

Может быть, вы можете просто проверить, если ваш файл будет загружен в настройках или даже на ничью, и я верю, что вы хотите, чтобы объявление линий за пределами установки, сома вещи, как:

[КОД Изменено]

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() начинается до того, как будет получен результат диалогового окна. Испытание в розыгрыше было бы пустой тратой процессора. Должен быть способ дождаться ответа на диалоговое окно перед тем, как выполнить draw(). Все остальные языки, которые я знаю, это делают. – Eric

+0

Теперь, я думаю, что понимаю вас, вам нужно подумать о двух разных вещах: filePath и fileContents. Я снова отредактировал код выше, проверьте его; –

1

Решение vk является правильной, поскольку он использует предопределенные методы в обработке и лучше работает в жизни программы, так как он разрешен для запуска, просто ничего не отображает. Это (почти) всегда лучше доверять предоставленной структуре вместо взлома, но я дам ее как альтернативный ответ. Это особенно полезно, если вы хотите открыть диалоговое окно до запуска даже 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

Благодарим за отзыв, будет ли эта работа обработана? Я предпочитаю открыть диалог в setup(). Как я уже писал выше, draw() запускается независимо от результата диалогового окна. Если я не буду явно определять myInputFile (который работает) перед открытием диалога, я получаю сообщение об ошибке. Если я введу новое имя файла в диалоговом окне, оно не учитывается, так как в это время уже выполняется draw(). – Eric

+0

Это действительно работает! В отличие от «selectInput» («Выбрать файл:», «fileSelected»); », этот диалог поворота фактически ждет моего ввода перед запуском draw(). Вот что я хотел, спасибо Петрос! – Eric

+0

Добро пожаловать! Вы всегда можете переместить JFileChooser в setup(), и он будет работать одинаково! Кроме того, не забудьте принять ответ! –

Смежные вопросы