2016-08-12 2 views
1

J'ai un programme qui ouvre actuellement une interface graphique et permet à l'utilisateur d'entrer leur nom ainsi que les langues qu'ils connaissent. Lorsque le bouton Soumettre est pressé, il est ensuite traduit dans une sortie de la console ainsi que d'un fichier bloc-notes lorsqu'il est exécuté en tant que fichier JAR exécutable. Mon problème est, chaque fois que je ferme le programme et le rouvre, alors les sorties sauvegardées précédentes sont supprimées. Comment pourrais-je contourner cela?Comment puis-je faire en sorte que mon programme crée un nouveau nom de fichier de sortie chaque fois qu'il est rouvert?

Code Runnable:

package guiChallenge; 

import java.awt.BorderLayout; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import javax.swing.border.TitledBorder; 
import javax.swing.JCheckBox; 
import javax.swing.UIManager; 
import java.awt.Color; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.PrintStream; 
import java.awt.event.ActionEvent; 

public class guiChallenge extends JFrame { 

    /** 
    * 
    */ 
    private JPanel contentPane; 
    private JTextField firstNameTextField; 
    private JTextField lastNameTextField; 
    private JCheckBox javaCheckBox, cCheckBox, c2CheckBox, pythonCheckBox, phpCheckBox, htmlCheckBox; 
    String javaLanguage, cLanguage, c2Language, phpLanguage, pythonLanguage, htmlLanguage; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        guiChallenge frame = new guiChallenge(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    * @throws FileNotFoundException 
    */ 
    public guiChallenge() throws FileNotFoundException { 

     PrintStream output = new PrintStream(new FileOutputStream("Report.txt")); 
     System.setOut(output); 

     setTitle("Programmer Entry"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 

     JPanel namePanel = new JPanel(); 
     namePanel.setBorder(new TitledBorder(null, "Name", TitledBorder.LEADING, TitledBorder.TOP, null, null)); 
     namePanel.setBounds(10, 11, 414, 106); 
     contentPane.add(namePanel); 
     namePanel.setLayout(null); 

     JLabel firstNameLabel = new JLabel("First Name: "); 
     firstNameLabel.setBounds(10, 18, 81, 33); 
     namePanel.add(firstNameLabel); 

     JLabel lastNameLabel = new JLabel("Last Name: "); 
     lastNameLabel.setBounds(10, 62, 89, 33); 
     namePanel.add(lastNameLabel); 

     firstNameTextField = new JTextField(); 
     firstNameTextField.setBounds(79, 24, 155, 20); 
     namePanel.add(firstNameTextField); 
     firstNameTextField.setColumns(10); 

     lastNameTextField = new JTextField(); 
     lastNameTextField.setColumns(10); 
     lastNameTextField.setBounds(79, 68, 155, 20); 
     namePanel.add(lastNameTextField); 

     JPanel languagesPanel = new JPanel(); 
     languagesPanel.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Languages", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0))); 
     languagesPanel.setBounds(10, 128, 414, 122); 
     contentPane.add(languagesPanel); 
     languagesPanel.setLayout(null); 

     javaCheckBox = new JCheckBox("Java"); 

     javaCheckBox.setBounds(6, 20, 97, 23); 
     languagesPanel.add(javaCheckBox); 

     cCheckBox = new JCheckBox("C"); 

     cCheckBox.setBounds(6, 46, 97, 23); 
     languagesPanel.add(cCheckBox); 

     c2CheckBox = new JCheckBox("C++"); 

     c2CheckBox.setBounds(6, 72, 97, 23); 
     languagesPanel.add(c2CheckBox); 

     phpCheckBox = new JCheckBox("PHP"); 

     phpCheckBox.setBounds(117, 20, 97, 23); 
     languagesPanel.add(phpCheckBox); 

     pythonCheckBox = new JCheckBox("Python"); 

     pythonCheckBox.setBounds(117, 46, 97, 23); 
     languagesPanel.add(pythonCheckBox); 

     htmlCheckBox = new JCheckBox("HTML"); 

     htmlCheckBox.setBounds(117, 72, 97, 23); 
     languagesPanel.add(htmlCheckBox); 

     JButton submitUserButton = new JButton("Submit User"); 
     submitUserButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 


       System.out.println("Applicant Report:"); 
       System.out.println(); 
       System.out.println("First Name: " + firstNameTextField.getText() + " Last Name: " + lastNameTextField.getText()); 
       System.out.println(); 
       System.out.println("Languages known: "); 

       if(javaCheckBox.isSelected() == true){ 
       System.out.println("Java"); 
       } 

       if(cCheckBox.isSelected() == true){ 
       System.out.println("C"); 
       } 

       if(c2CheckBox.isSelected() == true){ 
       System.out.println("C++"); 
       } 

       if(phpCheckBox.isSelected() == true){ 
       System.out.println("PHP"); 
       } 

       if(pythonCheckBox.isSelected() == true){ 
       System.out.println("Python"); 
       } 

       if(htmlCheckBox.isSelected() == true){ 
       System.out.println("HTML"); 
       } 

       System.out.println(""); 
       System.out.println("Languages not known: "); 

       if(javaCheckBox.isSelected() == false){ 
        System.out.println("Java"); 
        } 

       if(cCheckBox.isSelected() == false){ 
        System.out.println("C"); 
        } 

       if(c2CheckBox.isSelected() == false){ 
        System.out.println("C++"); 
        } 

       if(phpCheckBox.isSelected() == false){ 
        System.out.println("PHP"); 
        } 

       if(pythonCheckBox.isSelected() == false){ 
        System.out.println("Python"); 
        } 

       if(htmlCheckBox.isSelected() == false){ 
        System.out.println("HTML"); 
        } 

       resetPanels(); 

      } 
     }); 
     submitUserButton.setBounds(220, 46, 184, 23); 
     languagesPanel.add(submitUserButton); 
    } 

    public void resetPanels(){ 
     firstNameTextField.setText(""); 
     lastNameTextField.setText(""); 
     javaCheckBox.setSelected(false); 
     cCheckBox.setSelected(false); 
     c2CheckBox.setSelected(false); 
     phpCheckBox.setSelected(false); 
     pythonCheckBox.setSelected(false); 
     htmlCheckBox.setSelected(false); 

    } 
} 

Merci pour votre temps.

+0

Considérez également 'java.util.prefs.Preferences', pour [exemple] (http://stackoverflow.com/a/34616583/230513). – trashgod

Répondre

0

Vous pouvez créer un nom de fichier différent à chaque fois en ajoutant le nom de l'utilisateur à un fichier appelé "report_" + son nom.

EDIT: J'ai lu votre code un peu plus. Voici une chose amusante qui est peut-être la meilleure façon de gérer votre sortie.

Vous pouvez réduire le nombre de fois que vous appelez System.out, mais en ajoutant simplement tout ce que vous voulez sortir à une chaîne en cours d'exécution (avec des caractères de nouvelle ligne ofc), puis en appelant simplement System.out là-dessus. Ensuite, vous pouvez également appeler output.write([String here]) une fois pour obtenir les résultats souhaités

2

Donc, le problème ici est que vous écrivez toujours à "report.txt". Chaque fois que vous exécutez le code, vous l'écrasez. Malheureusement, c'est un peu compliqué de gérer cela, car il n'y a pas de moyen facile (que je sache) de stocker ce que vous avez écrit à travers les sessions, mais il y a plusieurs façons de le faire. Voici 2:

1) créer le nom d'une exécution. Vous pouvez faire quelque chose comme:

String name = "report"; 
int count = 1; 
if(new File(name + ".txt").exists()) { 
    while(new File(name + count + ".txt").exists()) { 
     count++; 
    } 
    name += "" + count; 
} 
name += ".txt"; 

je ne suis pas sûr que le "" est nécessaire avant + count, mais je le mettre juste au cas où vous avez besoin de jeter count à un String.

2) vérifier tous les fichiers qui existent déjà. Vous écrivez toujours dans le même dossier, vous pouvez donc profiter de la méthode listFiles() pour les fichiers. Il va imprimer tous les fichiers dans le fichier sur lequel il est appelé, afin que vous puissiez voir à quoi vous avez écrit. Je pense que cela ne peut être appelé que sur les répertoires, donc vous devrez d'abord déterminer dans quel dossier vous vous trouvez.

Je dirais que la première façon est plus facile cependant. Si vous le souhaitez, vous pouvez également stocker les noms que vous avez utilisés, ou l'index de quel rapport ou d'un autre identificateur dans un fichier .txt, .cfg, .ini ou tout autre type de fichier, et lisez-le lorsque le programme démarre, puis l'édite quand un rapport est fait. FileOutputStream a la possibilité d'ajouter au lieu d'effacer l'original.

0

Il suffit d'utiliser un constructeur différent comme celui-ci:

PrintStream output = new PrintStream(new FileOutputStream("Report.txt", true)); 
2

Vous pouvez définir votre sortie pour ajouter au lieu de substitution, voir cette question: File Write - PrintStream append

PrintStream output = new PrintStream(new FileOutputStream("Report.txt", true)); 

Je pris votre code, changé votre ligne avec la ligne ci-dessus (ligne ~ 55), et mon dossier a commencé à chercher comme ceci:

Applicant Report: 

First Name: Person Last Name: TheirLName 

Languages known: 
Java 

Languages not known: 
C 
C++ 
PHP 
Python 
HTML 
Applicant Report: 

First Name: AnotherGuy Last Name: Doe 

Languages known: 
PHP 
Python 

Languages not known: 
Java 
C 
C++ 
HTML 

Ainsi, vous pouvez modifier la façon dont vous faites de nouvelles lignes et comme dans votre sortie, mais à part ça, il a l'air bien.

+0

Nice, je ne savais pas que vous pouviez faire ça? Une idée s'il existe un moyen de donner à l'utilisateur une option pour ajouter ou créer un nouveau fichier texte? – SkyPlus

+1

Vous pouvez inclure une case à cocher ou quelque chose que vous connectez à ce champ. Comme: 'PrintStream output = new PrintStream (nouveau FileOutputStream (" Report.txt ", appendData.isSelected()))' Personnellement, je n'aime pas l'idée de donner à l'utilisateur une option pour effacer toutes les anciennes données par –

+0

@LordFarquaad hmm, et si je faisais un filechooser afin qu'ils puissent choisir d'enregistrer dans un nouveau fichier? Je ne sais pas où je serais capable de les laisser l'ajouter si dans cette situation? – SkyPlus