Я пишу программу для сбора информации из двух текстовых файлов для добавления в таблицы в базе данных. Чтобы позволить пользователю выбирать свои собственные файлы, я создал нестатический метод с именем chooseFile()
, который использует класс JFileChooser
для представления showOpenDialog
(я также пробовал его как статический метод с теми же результатами. Если это звучит так, как будто я' полагаю, вы правы - я так себе с программированием).
Насколько я понимаю, вызовы классов Swing в main()
должны выполняться с использованием invokelater
. Все это работало нормально (JVM успешно завершает работу) для одного вызова chooseFile()
, но когда я добавил второй вызов chooseFile()
, JVM продолжает работать бесконечно. Однако программа завершается нормально с обоими вызовами chooseFile()
, если я делаю это без использования invokelater
. Добавление System.exit(0)
после второго вызова в invokelater
также позволяет программе завершиться нормально.
Из того, что мне удалось собрать, программа не завершится, пока все потоки (не демона) не будут закрыты. Тем не менее, я думал, что цель использования invokelater
заключалась в том, чтобы передать все действия, связанные с Swing, не связанные с потоками, в EDT. Является ли использование System.exit(0)
лучшей практикой или есть что-то еще, о чем мне следует знать?
Вот мой SSCCE:
package ptMngr;
import java.io.IOException;
import java.nio.file.Path;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
public class ParticipantManager {
private Path chooseFile() throws IOException{
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("Text Files", "txt","csv");
chooser.setFileFilter(filter);
int returnVal = chooser.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION) {
System.out.println("You chose to open this file: " +
chooser.getSelectedFile().getName());
}
Path path = chooser.getSelectedFile().toPath();
return path;
}
/**
* @param args the command line arguments
*/
public static void main(String[] args){
// ParticipantManager pm = new ParticipantManager();
// try {
// pm.chooseFile();
// pm.chooseFile();
//
// } catch (IOException ex) {
// Logger.getLogger(ParticipantManager.class.getName()).log(Level.SEVERE, null, ex);
// }
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
ParticipantManager pm = new ParticipantManager();
try {
pm.chooseFile();
pm.chooseFile();
System.exit(0);
} catch (IOException ex) {
Logger.getLogger(ParticipantManager.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
}
JFrame
и использовалJOptionPane
, поэтому мне не нужно возиться с макетом. Однако одним недостатком этого подхода является то, что пользователю не сообщается, что программа все еще работает, поэтому мне в любом случае может понадобитьсяJFrame
, который должен устранить проблему. Но я думаю, что вопрос остается в силе. - person John Jones   schedule 19.11.2015