2014-06-06 2 views
0

Donc, ce que j'essaie de faire, c'est que le programme enregistre le fichier lorsque l'utilisateur clique sur le bouton Quitter, de sorte que la prochaine fois que je l'exécute, tous les utilisateurs sont toujours là. Chaque fois que je réexécute le programme, le fichier est vide et c'est comme si le premier passage n'avait jamais eu lieu. Que dois-je faire pour enregistrer le fichier?Enregistrer un fichier objet lorsque le cadre est fermé

Donc, c'est ce que j'ai maintenant, mais il enregistre seulement l'entrée de la première exécution et n'ajoute jamais de nouveaux utilisateurs quand je l'exécute. Ai-je mis quelque chose au mauvais endroit ou oublié quelque chose?

public class Admin extends JFrame implements ActionListener{ 

static ArrayList<User> users = new ArrayList<User>(); 
static FileOutputStream fos; 
FileInputStream fis; 
static ObjectOutputStream oos; 
ObjectInputStream ois; 
JTextField realname = new JTextField("", 20); 
JTextField username = new JTextField("", 20); 
JTextField password = new JTextField("", 20); 
JTextField repassword = new JTextField("", 20); 
JLabel rnlabel = new JLabel("Real Name"); 
JLabel unlabel = new JLabel("Username"); 
JLabel pwlabel = new JLabel("Password"); 
JLabel rpwlabel = new JLabel("Rewrite Password"); 
String name; 
String uname; 
StringBuilder S = new StringBuilder("Registered Users\n"); 



//-------------------------------------------------------------------------- 
public static void main(String[] args) throws ClassNotFoundException,FileNotFoundException,IOException, NoSuchAlgorithmException { 
try{ 
    Admin admin = new Admin(); 
} 
catch (ClassNotFoundException e){ 
    System.err.println(" A ClassNotFoundException error was found in main."); 
    e.printStackTrace(); 
    }  
//catch (NoSuchAlgorithmException e){ System.err.println("SHA-1 algorithm not available"); System.exit(0);} 
catch (FileNotFoundException e){ 
    System.err.println(" A FileNotFoundException error was found in main."); 
    e.printStackTrace(); 
    } 
catch (IOException e){ 
    System.err.println(" A IOException error was found in main."); 
    } 
} 
//-------------------------------------------------------------------------- 
// Data members for the controller. 
//-------------------------------------------------------------------------- 
JTabbedPane tp = new JTabbedPane(); 

JButton quitButton = new JButton("Quit"); 

JPanel newCard = new JPanel(new BorderLayout()); 
JButton submitButton = new JButton("Submit"); 
JPanel buttonPanel1 = new JPanel(new GridLayout(6, 1)); 
JTextArea data = new JTextArea(); 
JScrollPane userPane = new JScrollPane(data); 

//-------------------------------------------------------------------------- 
public Admin() throws IOException, ClassNotFoundException, FileNotFoundException { 
    setBounds(200, 200, 800, 200); 
    initComponents(); 
    submitButton.addActionListener(this); 
    quitButton.addActionListener(this); 
    setVisible(true); 


} 

//-------------------------------------------------------------------------- 
public void actionPerformed(ActionEvent e) { 

    try (ObjectInputStream is = new ObjectInputStream(new FileInputStream("userfile.txt"))) { 
     users = (ArrayList<User>) is.readObject(); 
     updateList(); 
    } catch (IOException | ClassNotFoundException exp) { 
     exp.printStackTrace(); 
    } 

    Object source = e.getSource(); 
    if (source == submitButton){ 
     name = realname.getText(); 
     uname = username.getText(); 
     getPassword(); 
     for (int i = 0; i < users.size(); i++){ 
      System.out.println(users.get(i).toString()); 
     } 
     updateList(); 
    } 

    if (source == quitButton) { 
     try (ObjectOutputStream os = new ObjectOutputStream(
       new FileOutputStream("userfile.txt"))) { 
      os.writeObject(users); 
     } catch (IOException exp) { 
      exp.printStackTrace(); 
     } 
     System.exit(0); 
    } 
} 

//---------------------------------------------------------------------------- 
protected void updateList() { 
    for (User object : users) { 
     S.append(object + "\n"); 
    } 
    String text = S.toString(); 
    data.setText(text); 
} 


//------------------------------------------------------------------------------  
private void getPassword() { 

    String pw = password.getText().toString(); 
    String pword_check = repassword.getText().toString(); 
    if (pw.equals(pword_check)){ 
     users.add(new User(name, uname, pw)); 
     realname.setText(""); 
     username.setText(""); 
     password.setText(""); 
     repassword.setText(""); 
    } 
    else{ 
     JOptionPane.showMessageDialog(null, 
       "Passwords do not match. Re-enter both of them."); 
     password.setText(""); 
     repassword.setText(""); 
    } 
} 

//------------------------------------------------------------------------------ 


//------------------------------------------------------------------------------ 
void initComponents(){ 
    //-- The New User Screen ----------------------------------------------- 
    JPanel rname = new JPanel(new GridLayout(1, 3)); 
    rname.setLayout(new GridLayout(1, 2)); 
    rname.add(realname); 
    rname.add(rnlabel); 

    JPanel uname = new JPanel(new GridLayout(1, 3)); 
    uname.setLayout(new GridLayout(1, 2)); 
    uname.add(username); 
    uname.add(unlabel); 

    JPanel npword = new JPanel(new GridLayout(1, 3)); 
    npword.setLayout(new GridLayout(1, 2)); 
    npword.add(password); 
    npword.add(pwlabel); 

    JPanel nrpword = new JPanel(new GridLayout(1, 3)); 
    nrpword.setLayout(new GridLayout(1, 2)); 
    nrpword.add(repassword); 
    nrpword.add(rpwlabel); 

    buttonPanel1.add(rname, BorderLayout.CENTER); 
    buttonPanel1.add(uname, BorderLayout.CENTER); 
    buttonPanel1.add(npword, BorderLayout.CENTER); 
    buttonPanel1.add(nrpword, BorderLayout.CENTER); 
    buttonPanel1.add(submitButton, BorderLayout.CENTER); 
    buttonPanel1.add(quitButton, BorderLayout.CENTER); 
    buttonPanel1.setPreferredSize(new Dimension(150, 10)); 
    newCard.add(buttonPanel1); 
    userPane.setPreferredSize(new Dimension(350, 50)); 
    newCard.add(userPane, "East"); 


    //------------------------------------------------------------------------- 
    tp.addTab("New User", newCard); 
    super.setTitle("Login System"); 
    Container pane = getContentPane(); 
    pane.add(tp, BorderLayout.CENTER); 
} 

} 
+1

Vous lisez l'objet lorsque vous traitez quitButton? – MadProgrammer

Répondre

1

Il y a une interface appelée WindowListener que vous devez mettre en œuvre dans votre classe. Il vous permet d'exécuter du code sur la fenêtre ouverte fermer etc.

+1

* Ce que j'essaie de faire, c'est que le programme enregistre le fichier lorsque l'utilisateur clique sur le bouton Quitter *. Pouvez-vous aider à résoudre ce problème plutôt que de fournir un autre gestionnaire. – Braj

+0

@Braj J'ai voté votre commentaire, puis j'ai regardé à nouveau le titre de * "Sauvegarder un fichier objet ** quand le cadre est fermé **" * et cela met le 'bouton' dans un contexte différent. Si je me réfère au petit bouton «x» que je vois sur une application de bureau. dans Windows, je m'attends à ce qu'il se ferme. Si une application Java. doit faire des choses sur l'application. close, un 'WindowListener' est un bon moyen de détecter cet état 'closing'. –

0

Ce que vous avez fait n'est pas écrire quelque chose!

Dans votre code:

if (source == quitButton) { 
      try { 
       fis = new FileInputStream("userfile.txt"); 
       ois = new ObjectInputStream(fis); 
       ois.readObject(); 
       ois.close(); 
      } catch (IOException | ClassNotFoundException ev) { 
       ev.printStackTrace(); 
      } 
      System.exit(0); 
     } 

Votre venez de lire quelque chose et ne rien faire avec vos SIF, non?

+0

En fait, si vous regardez le début de la 'actionPerformed', l'OP effectivement écrit le contenu du fichier, mais pour une raison que je ne connais pas, lire le fichier sur quitter, au lieu de le lire lorsque la classe était construit ... – MadProgrammer

1

Vous lisez le contenu du fichier sur quitButton

if (source == quitButton) { 
    try { 
     fis = new FileInputStream("userfile.txt"); 
     ois = new ObjectInputStream(fis); 
     ois.readObject(); 
     ois.close(); 
    } catch (IOException | ClassNotFoundException ev) { 
     ev.printStackTrace(); 
    } 
    System.exit(0); 
} 

au lieu d'écrire ...

Vous pouvez essayer quelque chose comme ...

if (source == quitButton) { 
    try (ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("userfile.txt"))) { 
     os.writeObject(users); 
    } catch (IOException exp) { 
     exp.printStackTrace(); 
    } 
    System.exit(0); 
} 

à la place. ..

Pour lire le contenu, il suffit de faire quelque chose comme ...

try (ObjectInputStream is = new ObjectInputStream(new FileInputStream("userfile.txt"))) { 
    users = (ArrayList<User>) is.readObject(); 
} catch (IOException exp) { 
    exp.printStackTrace(); 
} 

maintenant, parce que le JTextArea doit maintenant être mis à jour en deux endroits, je créé une méthode simple ...

protected void updateList() { 
    for (User object : users) { 
     S.append(object + "\n"); 
    } 
    String text = S.toString(); 
    data.setText(text); 
} 

qui met à jour simplement le JTextArea avec le contenu actuel de la liste User.

Ce que j'ajouté au code de chargement ...

try (ObjectInputStream is = new ObjectInputStream(new FileInputStream("userfile.txt"))) { 
    users = (ArrayList<User>) is.readObject(); 
    updateList(); 
} catch (IOException exp) { 
    exp.printStackTrace(); 
} 

que je plaçai à la fin de votre constructeur classes (de sorte que l'interface utilisateur a été initialisée en premier)

Comme Braj garde de mentionner, ce le code provient de votre méthode actionPerformed (après les deux instructions if), ce qui signifie qu'il est vraiment au mauvais endroit. La seule fois où vous voulez exécuter ce code est lorsque la liste a changé, par exemple ...

public void actionPerformed(ActionEvent e) { 

    Object source = e.getSource(); 
    if (source == submitButton) { 
     name = realname.getText(); 
     uname = username.getText(); 
     getPassword(); 
     for (int i = 0; i < users.size(); i++) { 
      System.out.println(users.get(i).toString()); 
     } 
     updateList(); 
    } else if (source == quitButton) { 
     try (ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("userfile.txt"))) { 
      os.writeObject(users); 
     } catch (IOException exp) { 
      exp.printStackTrace(); 
     } 
     System.exit(0); 
    } 
} 

Maintenant, après avoir dit tout cela, la sérialisation d'objets est pas un bon choix pour le stockage à long terme des données, la sérialisation était destinée au stockage à court terme d'objets, typiquement pour la transmission à travers le fil (mais sans s'y limiter).

Pour les données structurées, je préfère utiliser XML, Java a une bonne liaison XML, voir Introduction to JAXB pour plus de détails.

Ce n'est pas la seule option, consultez How can I save the state of my program and then load it? pour une description plus détaillée.

+0

et tout code après 'System.exit (0);' ne devrait pas être là? – Braj

+0

@Braj C'est dans une instruction 'if-else', techniquement, vous pourriez exécuter du code dans d'autres branches pour d'autres raisons ... – MadProgrammer

+0

oui c'est pourquoi je pointe cette chose. Il y a du code après la condition 'if'. – Braj

Questions connexes