2012-10-27 153 views
2

我正在处理一个程序,该程序保存四个文本字段和文本区域的内容,并在单击“发送”按钮时将它们保存到文本文件中。输出应该是这个样子:将文本字段/区域保存为文本文件

To: [Text Field] 
CC: [Second Text Field] 
Bcc: [Third Text Field] 
Subject: [Fourth Text Field] 
Message: 
[Text Area] 

例如,文本文件的第一行会“为:”文本字段的内容,并将然后跳到下一行。

尽管我的程序编译,文本文件保持空白。我尝试了所有我能想到的,但似乎无法弄清楚原因。这里是我的代码:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 

public class EmailProg extends JFrame implements ActionListener { 
    private JPanel panNorth; 
    private JPanel panCenter; 
    private JPanel panSouth; 

    private JLabel toLabel; 
    private JLabel ccLabel; 
    private JLabel bccLabel; 
    private JLabel subLabel; 
    private JLabel msgLabel; 

    private JTextField toField; 
    private JTextField ccField; 
    private JTextField bccField; 
    private JTextField subField; 
    private JTextArea msgArea; 

    private JButton send; 


    public EmailProg() { 
     setTitle("Compose Email"); 
     setLayout(new BorderLayout()); 

     panNorth = new JPanel(); 
     panNorth.setLayout(new GridLayout(4, 2)); 
     JLabel toLabel = new JLabel("To:"); 
     panNorth.add(toLabel); 
     JTextField toField = new JTextField(15); 
     panNorth.add(toField); 
     JLabel ccLabel = new JLabel("CC:"); 
     panNorth.add(ccLabel); 
     JTextField ccField = new JTextField(15); 
     panNorth.add(ccField); 
     JLabel bccLabel = new JLabel("Bcc:"); 
     panNorth.add(bccLabel); 
     JTextField bccField = new JTextField(15); 
     panNorth.add(bccField); 
     JLabel subLabel = new JLabel("Subject:"); 
     panNorth.add(subLabel); 
     JTextField subField = new JTextField(15); 
     panNorth.add(subField); 
     add(panNorth, BorderLayout.NORTH); 

     panCenter = new JPanel(); 
     panCenter.setLayout(new GridLayout(2, 1)); 
     JLabel msgLabel = new JLabel("Message:"); 
     panCenter.add(msgLabel); 
     JTextArea msgArea = new JTextArea(5, 15); 
     panCenter.add(msgArea); 
     add(panCenter, BorderLayout.CENTER); 

     panSouth = new JPanel(); 
     panSouth.setLayout(new FlowLayout()); 
     JButton send = new JButton("Send"); 
     send.addActionListener(this); 
     panSouth.add(send); 
     add(panSouth, BorderLayout.SOUTH); 


    } 

     public void actionPerformed (ActionEvent event) { 
      try { 
       //Write labels and corresponding fields to text file 
       BufferedWriter outfile = new BufferedWriter(new FileWriter("email.txt")); 
       outfile.write("To: "); 
       outfile.write(toField.getText()); 
       //repeat for CC, Bcc, and Subject labels/fields, and for Message label/text area 


      } 
      catch(FileNotFoundException e) { 
       System.out.println("File not found."); 
      } 
      catch(NullPointerException j){ 
       System.out.println("Null."); 
      } 
      catch(IOException k){ 
       System.out.println("IO Exception.");    
      } 
      JOptionPane.showMessageDialog(this,"Saved"); 
     } 


    public static void main(String[] args) { 
     EmailProg win = new EmailProg(); 
     win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     win.pack(); 
     win.setVisible(true); 
    } 
} 

在此先感谢您提供的任何帮助。

回答

2

线

outfile.write(toField.getText()); 

如果使进入NullPointerException码块中的应用。这是因为未设置变量toField

要解决,你可以在你的构造移除的toField声明的JTextField关键字把它分配给类的成员变量:

toField = new JTextField(15); 

同样在应用程序中的其它组件,您可能需要构造函数的范围之外:

ccLabel = new JLabel("CC:"); 
    ccField = new JTextField(15); 
    // etc. 

也是另一个重要的注意事项—不要忘了写后关闭输出流,否则这是缓存的任何数据写入将而不是写入磁盘。

outfile.close(); 
+0

我从构造函数中删除了JTextField和类似的关键字,但是文本文件仍然是空白的。 – user1699107

+0

您需要关闭输出流。查看更新。 – Reimeus

+0

非常感谢,完美的作品! – user1699107

1

更改JTextField toField = new JTextField(15);toField = new JTextField(15);。这将初始化您的类成员变量,而不是创建新的局部变量。

由于您已经重新定义了它,所以在actionPerformed()中使用的类级别变量(toField)未进行初始化,因此是问题。

相关问题