2014-12-01 2 views
0

В приведенном ниже коде используется метод, называемый displayClassSet(). Я поместил его в do/while, чтобы воссоздать ошибку, которую JFileChooser не закрывает. Когда do/while не существует, он работает нормально. В исходном коде (более 700 строк) он переходит к этому методу с помощью переключателя. Таким образом, пользователь выбирает параметр, который выполняет displayClassSet(). Как только это будет сделано, он вернется в меню. На данный момент JFileChooser остается открытым и не разрешает никаких новых вариантов меню. Надеюсь, я достаточно ясен. Я думал, что это будет лучше, чем пытаться сбросить огромный файл здесь. В приведенном ниже примере кода, если вы выберете «n» после того, как вы вернетесь, он зависает. Если вы выберете «y», он закрывается, но, опять же, пользователь не может быть выполнен в исходном коде. Они не могут из-за проблемы с подвеской, о которой я упоминал. Я также включил образец файла TXT, который он должен открыть.Почему JFileChooser не подходит?

Я пробовал: bufRdr.close(); и in.close();. Я также прочитал несколько веб-сайтов на JFileChooser.

Вы видите, что я делаю неправильно?

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.Scanner; 
import java.util.StringTokenizer; 
import javax.swing.JFileChooser; 

public class TestingArrays { 

    public static void main(String[] args) throws IOException { 
     boolean done = false; 
     Scanner console = new Scanner(System.in); 
     do { 
      displayClassSet(); 
      done = getYNConfirm(console, "Done?"); 
     } while (!done); 

    } 

    public static Boolean getYNConfirm(Scanner pipe, String prompt) 
    { 
     Boolean result = false; 
     String input = ""; 
     String trash = ""; 

     do { 
      System.out.print(prompt + " [y/n] "); 
      if (pipe.hasNextDouble()) { 
       trash = pipe.nextLine(); 
       System.out.println("Error: You entered \"" + trash + "\", Try again."); 
      } else { 
       input = pipe.nextLine(); 
       if (input.equalsIgnoreCase("y")) { 
        result = true; 
       } else if (input.equalsIgnoreCase("n")) { 
        result = false; 
       } 
      } 
     } while (!input.equalsIgnoreCase("y") && !input.equalsIgnoreCase("n")); 
     return result; 
    } 

    static void displayClassSet() throws IOException 
    { 
     File classFile = new File("/"); 
     int row = 0; 
     int col = 0; 
     //int columnLength = 0; 
     //Scanner inFile; 
     int lineCount = 0; 
     int wordCount = 0; 
     int charCount = 0; 
     int countColumns = 0; 
     int maxLineLength = 0; 
     int sum = 0; 
     int high = 0; 
     int low = 100; 
     String line; 
     Scanner in; 

     JFileChooser chooser = new JFileChooser(); 

     try { 
      if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { 
       classFile = chooser.getSelectedFile(); 
       in = new Scanner(classFile); 
       while (in.hasNextLine()) { 
        line = in.nextLine(); 
        lineCount++; // Same as lineCount = lineCount + 1; 
        charCount += line.length(); 
        wordCount += countWords(line); 
        countColumns += countColumns(line); 
        int columnOneWidth = 25; 
        int gradeColumnWidth = 10; 
        maxLineLength = columnOneWidth + (((countColumns/lineCount + 2)) * gradeColumnWidth); 
       } 

       String[][] data = new String[lineCount][countColumns/lineCount]; 

       BufferedReader bufRdr = new BufferedReader(new FileReader(classFile)); 

       //read each line of text file 
       while ((line = bufRdr.readLine()) != null && row < lineCount) { 
        StringTokenizer st = new StringTokenizer(line, ","); 
        while (st.hasMoreTokens()) { 
         //get next token and store it in the array 
         data[row][col] = st.nextToken(); 
         col++; 
        } 
        col = 0; 
        row++; 
       } 
       bufRdr.close(); 
       in.close(); 
       // CODE REMOVED - SIMPLE FOR LOOPS TO DISPLAY INFORMATION 
       System.out.println("display stuff here..."); 
      } else { 
       System.out.println("You must choose a file.\nReturn to the menu."); 
       return; 
      } 
     } catch (FileNotFoundException ex) { 
      System.out.println("Error: Could not open class file!"); 
      System.exit(0); 
     } catch (IOException ex) { 
      ex.getStackTrace(); 
      System.out.println("IO ERROR trying to read file!"); 
      return; 
     } 
    } 

    static int countWords(String in) { 
     String trim = in.trim(); 

     if (trim.isEmpty()) { 
      return 0; 
     } 
     return trim.split("\\s+").length; //separate string around spaces 
    } 

    static int countColumns(String in) { 
     String trim = in.trim(); 

     if (trim.isEmpty()) { 
      return 0; 
     } 
     return trim.split(",").length; //separate string around spaces 
    } 
} 

текстовый файл содержит:

2nd Grade Pyromancy, Lab01, Quiz01, Test01 
Ferrel Quinn, 75, 70, 80 
Billy Brago, 70, 80, 90 
Sally Simpson, 50, 60, 60 
Django Rude, 100, 90, 90 
+0

Можете ли вы сделать код немного короче? См. [Минимальные, завершенные и проверенные примеры] (http://stackoverflow.com/help/mcve) – FlyingPiMonster

+0

Я сделал это как можно короче, чем здесь. displayClassSet() - фокус. Остальное поддерживает воспроизведение ошибки. – Dann

ответ

0

Я создал мою собственную форму сделал кнопку и добавил слушатель события действия к кнопке. Я немного изменил код с вашего поста с этим. С этим я смог вернуться к оригинальной форме без каких-либо проблем.
Это единственные изменения в коде для функции displayClassSet(). Я не внес никаких изменений в какой-либо другой код, указанный в вопросе.

File classFile; 
int row = 0; 
int col = 0; 
//int columnLength = 0; 
//Scanner inFile; 
int lineCount = 0; 
int wordCount = 0; 
int charCount = 0; 
int countColumns = 0; 
int maxLineLength = 0; 
int sum = 0; 
int high = 0; 
int low = 100; 
String line; 
Scanner in; 

File workingDirectory = new File(System.getProperty("user.dir"));//I only added this so as to 
//know the directory being used and would not have to search for it. 
JFileChooser chooser = new JFileChooser(); 
chooser.setCurrentDirectory(workingDirectory); 

я переехал заявление showOpenDialog и файлов классов из заявления попробовать/поймать

if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) 
{ 
    classFile = chooser.getSelectedFile(); 
    try 
    { 
     in = new Scanner(classFile); 
     while (in.hasNextLine()) { 
      line = in.nextLine(); 
      lineCount++; // Same as lineCount = lineCount + 1; 
      charCount += line.length(); 
      wordCount += countWords(line); 
      countColumns += countColumns(line); 
      int columnOneWidth = 25; 
      int gradeColumnWidth = 10; 
      maxLineLength = columnOneWidth + (((countColumns/lineCount + 2)) * gradeColumnWidth); 
     } 
    } 

Я отделил заявление попробовать/уловы для каждого отдельного файла открытия использования

catch (FileNotFoundException ex) 
    { 
     System.out.println("Error: Could not open class file!"); 
     System.exit(0); 
    }    
    catch (IOException ex) 
    { 
     ex.getStackTrace(); 
     System.out.println("IO ERROR trying to read file!"); 
     //return; 
    } 

    String[][] data = new String[lineCount][countColumns/lineCount]; 
    try 
    { 
     BufferedReader bufRdr = new BufferedReader(new FileReader(classFile)); 

     //read each line of text file 
     while ((line = bufRdr.readLine()) != null && row < lineCount) 
     { 
      StringTokenizer st = new StringTokenizer(line, ","); 
      while (st.hasMoreTokens()) { 
       //get next token and store it in the array 
       data[row][col] = st.nextToken(); 
       col++; 
      } 
       col = 0; 
       row++; 
     } 
    }catch (FileNotFoundException ex) 
    { 
     System.out.println("Error: Could not open class file!"); 
     System.exit(0); 
    }    
    catch (IOException ex) 
    { 
     ex.getStackTrace(); 
     System.out.println("IO ERROR trying to read file!"); 
     //return; 
    } 
    for(int x = 0; x < lineCount; x++)//I added this to check the contents of data[][] 
    { 
     for(int y = 0; y < (countColumns/lineCount); y++) 
     { 
      System.out.print(data[x][y]); 
     } 
     System.out.println(""); 
    } 
} 
else 
{ 
    System.out.println("You must choose a file.\nReturn to the menu."); 
    //return; 
} 

Я надеюсь, это поможет решить вашу проблему.

0

Я выполнил все предложения Дэвида Колера (большое вам спасибо за ваше время!). У меня все еще была моя особая проблема. Я начал комментировать абсолютно все, и проблема продолжалась, когда единственное, что произошло, - это открыть файл. Короче говоря, я запустил его на ПК, и это все в порядке. Я все еще думаю, что могу упорядочить свой код, но, похоже, проблема с JFileChooser на Mac.

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