Получение содержимого файла с использованием JFrame и BufferedReader

Код ниже это часть моего кода.

Проблема в кнопке "Generate Keys.." ничего не дает в текстовой области!

Я думаю, что буферизованный читатель не может получить путь к файлу.. я не знаю почему?!

   public class Finding_Candidate_Keys {   

  static String L[];
  static int size;
  static JFrame frame;
  static JTextArea textArea;
  static String     TextAreaContent = "";
  static File selectedFile;
  static String filePath;
  static JFileChooser fileChooser = new JFileChooser();
  static File file;


  static void displayJFrame()
  {
     frame = new JFrame("Advanced DB Project- Key Definition");
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     textArea = new JTextArea("");
     textArea.setSize(250,250);    
     textArea.setEditable(false);
     textArea.setVisible(true);
     JScrollPane scroll = new JScrollPane(textArea);
     scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
     scroll.setPreferredSize(new Dimension(350, 350));
     frame.add(scroll);
     frame.setVisible(true);

     JButton button = new JButton("Select File");

     button.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent ae) {

            textArea.setText("");
            FileNameExtensionFilter filter = new FileNameExtensionFilter("Text Files (*.txt)", "txt");
            fileChooser.setFileFilter(filter);


                           int returnValue = fileChooser.showOpenDialog(frame);


                if (returnValue == JFileChooser.APPROVE_OPTION)  
                {
                    if (fileChooser.getSelectedFile() != null) {
                    selectedFile = fileChooser.getSelectedFile();
                    filePath = selectedFile.getAbsolutePath();
                    file = new File (filePath);

                    textArea.append("Opening: " + selectedFile.getName() +  "\n");              
                    }
                } 
        else {
            textArea.setText("");
            textArea.append("Open command cancelled by user." +  "\n");
             }

          }
     });

      frame.setVisible(true);

              //********************
     JButton showDialogButton = new JButton("Generate Keys..");

     showDialogButton.addActionListener(
           new ActionListener()
           {
              public void actionPerformed(ActionEvent e)
              {
                 textArea.setText("");
                 textArea.append(TextAreaContent);
              }
           });

           frame.add(showDialogButton);
           frame.setVisible(true);

     //*********************

     frame.getContentPane().setLayout(new FlowLayout());
     frame.getContentPane().add(button);
     frame.setPreferredSize(new Dimension(500, 500));
     frame.setSize(400,460);
     frame.setLocationRelativeTo(null);
     frame.pack();
     frame.setVisible(true);   
  }

  public static void main(String[] args) throws IOException{    
     SwingUtilities.invokeLater(
           new Runnable()
           {
              public void run()
              {
                 displayJFrame();
              }
           });

     BufferedReader br = new BufferedReader(new FileReader(filePath));
     .
     .
     .

Обратите внимание: это работает правильно, если я использую имя файла, например:

BufferedReader br = new BufferedReader(new FileReader("input.txt"));

поставленный

BufferedReader br = new BufferedReader(new FileReader(filePath));

может кто-нибудь сказал мне, где ошибка?

также это появляется во время пробега:

Exception in thread "main" java.lang.NullPointerException
at java.io.FileInputStream.<init>(FileInputStream.java:124)
at java.io.FileInputStream.<init>(FileInputStream.java:87)
at java.io.FileReader.<init>(FileReader.java:58)
at Finding_Candidate_Keys.main(Finding_Candidate_Keys.java:110)

2 ответа

Вы никогда не инициализируете свой filePath переменная-член. Из-за этого он будет инициализирован в null, который является значением по умолчанию для объектов-членов. Поскольку он будет установлен на nullконструктор FileReader бросит NullPointerException, Вы можете решить это, инициализируя вашу переменную:

String filePath = "input.txt";

РЕДАКТИРОВАТЬ:

Как отмечено в комментариях, вы, кажется, инициализируете это в условном выражении в вашем displayJFrame метод. Этот метод вызывается исполняемым файлом, переданным SwingUtilities.invokeLater, Как следует из названия, этот метод не будет запускать Runnable передается напрямую, но позже будет выполняться в другом потоке. Таким образом, ваше значение не будет инициализировано, так как ваш вызов метода, скорее всего, будет выполняться после того, как вы используете значение в вашем main метод. Вам придется подождать, пока метод не будет завершен, возможное решение заключается в использовании функции SwingUtilities.invokeAndWait вместо SwingUtilities.invokeLater, Этот метод будет ожидать завершения вызова.

Вы не получаете текст, потому что вы установили его, чтобы не показывать текст. Вот как, в вашем действии слушатель для Generate Keys.. кнопка:

textArea.setText("");
textArea.append(TextAreaContent);

И ваш TextAreaContent в инициализируется с пустой строкой, в разделе инициализации вашего класса:

...
static String TextAreaContent = "";
...

Задавать TextAreaContent иметь то, что вы хотите увидеть. Например, вы можете сделать что-то вроде этого:

if (returnValue == JFileChooser.APPROVE_OPTION) {
    if (fileChooser.getSelectedFile() != null) {
        selectedFile = fileChooser.getSelectedFile();
        filePath = selectedFile.getAbsolutePath();
        file = new File(filePath);

        textArea.append("Opening: " + selectedFile.getName() + "\n");
        TextAreaContent = "You have selected some file: " + selectedFile.getName();
    }
} else {
     textArea.setText("");
     textArea.append("Open command cancelled by user." + "\n");
     TextAreaContent = "You chose no file";
}

Что касается ошибки, из-за invokeLater метод, displayJFrame Метод выполняется асинхронно в другом потоке, а следующая строка выполняется в основном потоке. Во время выполнения последней строки filePath все еще не может быть инициализирован, вызывая ошибку. Чтобы удалить ошибку, вы можете сделать эту проверку:

if (filePath != null) {
    BufferedReader br = new BufferedReader(new FileReader(filePath));
}
Другие вопросы по тегам