2013-10-13 96 views
0

我覺得我很接近,但仍然遇到我不明白的錯誤。我正嘗試使用保存按鈕將數據從我的JTable寫入文本文件。我也需要從文件加載回JTable。任何建議爲什麼這不能正常工作。從JTable寫入文本文件,從文本文件讀取到JTable

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.FileWriter; 
import java.io.FileReader; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.table.DefaultTableModel; 


/*PayrollProgram.java 
* Created by: Steve Totten 
* Created on: 10-13-2013 
* This program allows the user to enter the contact's 
* name, Email address, age, and phone number. Then the program 
* adds the information to a table for easy viewing 
* The program has a save button to save to a data file 
* it also has a load button that will read from a file to the table 
*/ 

    public class ContactInfo { 

    // Set up the size of the GUI window 
    private static final int FRAME_WIDTH = 900; 
    private static final int FRAME_HEIGHT = 400; 
    static JTable tblContacts; 
    static int ID = 0; 

    public static void main(String[] args) { 

     // Set up the user interface 
     final JFrame frame = new JFrame(); 
     final JPanel buttonPanel = new JPanel(); 
     frame.add(buttonPanel); 
     // I need this to be able to put the buttons where I want 
     buttonPanel.setLayout(null); 

     // Set up Add button and its location 
     final JButton buttonAdd = new JButton(" Add "); 
     buttonAdd.setBounds(50, 325, 100, 20); 
     buttonPanel.add(buttonAdd); 


     // Set up Exit button and its location 
     final JButton buttonExit = new JButton("Exit"); 
     buttonExit.setBounds(200, 325, 100, 20); 
     buttonPanel.add(buttonExit); 

     // Method for exit button 
     buttonExit.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 

       System.exit(0); 
      } 
     }); 

     // Set up Save button and its location 
     final JButton buttonSave = new JButton("Save"); 
     buttonSave.setBounds(350, 325, 100, 20); 
     buttonPanel.add(buttonSave); 

     // Set up Save button method 
     buttonSave.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       try{ 

        BufferedWriter bfw = new BufferedWriter(new FileWriter("C:\\Users\\Steve\\Workspace\\ContactInfo\\ContactInfo.txt")); 

         for (int i = 0 ; i < tblContacts.getRowCount(); i++) 
         { 

         for(int j = 0 ; j < tblContacts.getColumnCount();j++) 
         { 
          bfw.newLine(); 
          bfw.write((String)(tblContacts.getValueAt(i,j))); 
          bfw.write("\t");; 
         } 
         } 
         bfw.close(); 
      }catch(Exception ex) { 

       ex.printStackTrace(); 
      } 
      } 
     }); 
     // Set up Load button and its location 
     final JButton buttonLoad = new JButton("Load"); 
     buttonLoad.setBounds(500, 325, 100, 20); 
     buttonPanel.add(buttonLoad); 

     // Method for load button 
     buttonLoad.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       String line; 
       BufferedReader reader; 
        try{  
         reader = new BufferedReader(new FileReader("C:\\Users\\Steve\\Workspace\\ContactInfo\\ContactInfo.txt")); 
         while((line = reader.readLine()) != null) 
         { 
          tblContacts.add(null, line.split(", ")); 
         } 
         reader.close(); 
        } 
        catch(Exception ex){ 

       ex.printStackTrace(); 

        } 

      } 
     }); 
     // Set up Labels for name, hours, and pay rate 
     final JLabel lblFirst = new JLabel("Enter First Name: "); 
     lblFirst.setBounds(20, 5, 150, 100); 
     buttonPanel.add(lblFirst); 

     final JLabel lblLast = new JLabel("Enter Last Name: "); 
     lblLast.setBounds(20, 60, 150, 100); 
     buttonPanel.add(lblLast); 

     final JLabel lblAddress = new JLabel("Enter their Age: "); 
     lblAddress.setBounds(20, 115, 150, 100); 
     buttonPanel.add(lblAddress); 

     final JLabel lblAge = new JLabel("Enter Email Address:"); 
     lblAge.setBounds(20, 170, 150, 100); 
     buttonPanel.add(lblAge); 

     final JLabel lblPhone = new JLabel("Enter phone number:"); 
     lblPhone.setBounds(20, 225, 150, 100); 
     buttonPanel.add(lblPhone); 


     // Set up textboxes for all expected inputs 
     final JTextField txtFirst = new JTextField(); 
     txtFirst.setBounds(180, 40, 100, 25); 
     buttonPanel.add(txtFirst); 

     final JTextField txtLast = new JTextField(); 
     txtLast.setBounds(180, 95, 100, 25); 
     buttonPanel.add(txtLast); 

     final JTextField txtAge = new JTextField(); 
     txtAge.setBounds(180, 150, 100, 25); 
     buttonPanel.add(txtAge); 

     final JTextField txtPhone = new JTextField(); 
     txtPhone.setBounds(180, 260, 100, 25); 
     buttonPanel.add(txtPhone); 

     final JTextField txtEmail = new JTextField(); 
     txtEmail.setBounds(180, 210, 100, 25); 
     buttonPanel.add(txtEmail); 

     // Set up of columns in the table 
     String[] columns = { "ID", "Last Name", "First Name", "Age", "Email Address", 
       "Phone Number" }; 
     // Set up of the table with the appropriate column headers 
     final DefaultTableModel model = new DefaultTableModel(null, columns); 
     final JTable tblContacts = new JTable(); 
     tblContacts.setModel(model); 
     JScrollPane scrollPane = new JScrollPane(tblContacts); 
     scrollPane.setBounds(300, 20, 550, 300); 
     buttonPanel.add(scrollPane); 


     // Save button methods, including validation checking 
     buttonAdd.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (txtFirst.getText().length() == 0) { 
        JOptionPane.showMessageDialog(null, "Error: no first name"); 
        return; 
       } 

       if (txtLast.getText().length() == 0) { 
        JOptionPane.showMessageDialog(null, "Error: no last name"); 
        return; 
       } 

       int age = 0; 
       try { 
        age = Integer.parseInt(txtAge.getText()); 
       } catch (Exception ex) { 
        JOptionPane.showMessageDialog(null, 
          "Error: invalid age value"); 
        return; 
       } 

       if (age < 0 || age > 120) { 
        JOptionPane.showMessageDialog(null, 
          "Error: invalid age range (0 - 120 allowed)"); 
        return; 
       } 

       if (txtPhone.getText().length()==0){ 
        JOptionPane.showMessageDialog(null, "Error: no phone number "); 
        return; 
       } 


       // Add an ID number to each entry and add the entry to the table 
       ID++; 
       model.addRow(new Object[] { String.valueOf(ID), 
         txtLast.getText(), txtFirst.getText(), 
         txtAge.getText(), txtEmail.getText(), txtPhone.getText() }); 


       // Once entry is added to the table, the text fields are cleared for the next entry 
       txtLast.setText(""); 
       txtFirst.setText(""); 
       txtAge.setText(""); 
       txtPhone.setText(""); 
       txtEmail.setText(""); 



      } 
     });  
     /* 
     * This sets the size of the window along with the title and it sets up 
     * the exit on close X button to close the window when the X is clicked. 
     */ 

     frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); 
     frame.setTitle("Contact Information"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

} 
+1

'「......但仍然遇到我不明白的錯誤。」 - 請與我們分享任何完整的錯誤/異常消息。還請指出與錯誤相關的行號。 –

回答

2

調查結果和建議:

  • 你得到一個NullPointException(一NPE)當您嘗試使用您的JTable。
  • 這是因爲您正在遮蓋類字段tblContacts。這意味着你在該類中聲明瞭該字段,然後重新聲明並在主方法中初始化它。那麼當您重新聲明變量時,它是一個新的獨特變量,因此您將類字段留空。
  • 解決方案是不重新聲明變量在其他地方。
  • 另外,希望這段代碼只是一個演示代碼,而不是真正的程序。在你真實的程序中,你不會在靜態main方法中有任何這樣的代碼(或者除了非常簡短的主方法以外的任何靜態方法),並且你的大部分字段都是非靜態的實例字段。陰影的

例子:

public class Foo { 
    private int bar; // class field 

    public Foo() { 
    int bar = 3; // I've re-declared bar here and so the class field is still unassigned. 
    } 
} 

要更正:

public class Foo { 
    private int bar; // class field 

    public Foo() { 
    bar = 3; // bar not re-declared 
    } 
} 

看到區別?

+0

這有幫助,謝謝! – user2876507

+0

@ user2876507:不客氣。一旦你解決了這些問題,你會發現更多的問題,但是嘗試着去修復你的NPE - 研究拋出異常的行,然後回顧一下爲什麼變量沒有被初始化。 –