使用JFrame和BufferedReader获取文件内容

时间:2015-12-24 16:37:07

标签: java swing jframe bufferedreader jfilechooser

下面的代码是我代码的一部分。

“生成密钥..”按钮中的问题在文本区域没有任何内容!

我认为缓冲的阅读器无法获取文件路径..我不知道为什么?!

   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"));

insted of

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 个答案:

答案 0 :(得分:2)

您永远不会初始化filePath成员变量。因此,它将初始化为null,这是成员对象的默认值。由于它将设置为nullFileReader的构造函数将抛出NullPointerException。您可以通过初始化变量来解决此问题:

String filePath = "input.txt";

编辑:

如评论中所述,您似乎在displayJFrame方法的条件语句中初始化它。传递给SwingUtilities.invokeLater的runnable调用此方法。顾名思义,此方法不会直接运行传递给它的Runnable,而是稍后会在另一个线程上执行它。因此,您的值不会被初始化,因为您的方法调用很可能在您使用main方法中的值后运行。您必须等到方法完成,可能的解决方案是使用函数SwingUtilities.invokeAndWait而不是SwingUtilities.invokeLater。此方法将等待调用完成。

答案 1 :(得分:1)

您没有收到任何文字,因为您已将其设置为不显示文字。以下是@Stateless public class BeanA { @EJB private BeanB beanB; @PostConstruct public void init(){ // trying to do some pre-configuration beanB.configure(Map params); } public void doSomething(){ beanB.doSomething(); } } @Stateless public class BeanB { } 按钮的动作监听器中的方法:

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