2016-08-12 63 views
1

我有一个程序,它目前打开一个GUI,并允许用户输入他们的名字以及他们所知道的语言。当提交按钮被按下时,它会作为可执行JAR文件运行时转换为控制台输出以及记事本文件。我的问题是,每当我关闭程序并重新打开它时,以前保存的输出都会被删除。我怎么会绕过这个?如何让我的程序每次重新打开时创建一个新的输出文件名?

运行的代码:

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

    } 
} 

谢谢您的时间。

+0

对于[示例](http://stackoverflow.com/a/34616583/230513),还要考虑'java.util.prefs.Preferences'。 – trashgod

回答

0

您可以每次创建一个不同的文件名,方法是将用户的姓名附加到名为say“report_”的文件+他们的姓名。

编辑:我读了一些你的代码。这是一个有趣的事情,也许是更好的方式来处理你的输出。

您可以减少调用System.out的次数,但只需将要输出的所有内容附加到正在运行的字符串(换行符为ofc),然后在该字符串上调用System.out即可。然后您也可以拨打output.write([String here])一次以获得您想要的结果

2

所以,这里的麻烦是您总是写信给“report.txt”。每次你运行代码时,你都会覆盖它。可悲的是,处理这件事有点麻烦,因为我没有简单的方法(我知道)能够在会话中存储您写的内容,但有几种方法可以实现这一点。这里的2:

1)创建一个运行时的名称。你可以这样做:

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

我不知道该""+ count之前是必要的,但我把它万一你需要转换countString

2)检查所有已存在的文件。 你总是在写同一个文件夹,所以你可以利用文件的方法 listFiles()。它会打印出所调用文件中的所有文件,以便您可以看到您写入的内容。我认为它只能在目录上调用,所以你必须先找出你在哪个文件夹。

我会说第一种方式虽然更容易。如果你真的想要,你也可以存储你使用的名字,或者.txt,.cfg,.ini或者其他类型文件中的哪个报告或者其他标识符的索引,并且当程序被读取时启动,然后在进行报告时进行编辑。

0

FileOutputStream能够追加而不是擦除原件。只需使用一个不同的构造是这样的:

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

你可以设置你的输出追加而不是覆盖,看到了这个问题:File Write - PrintStream append

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

我把你的代码,打开你的线与线以上(行〜55),和我的文件开始寻找这样的:

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 

所以,你可能需要调整您如何在输出做新的生产线等,但比它看起来好等。

+0

不错,没有意识到你可以做到这一点?任何想法,如果有方法让用户选择追加或创建新的文本文件? – SkyPlus

+1

您可以包含一个复选框或您连接到该字段的内容。例如:'PrintStream输出=新的PrintStream(新的FileOutputStream(“Report.txt”,appendData.isSelected()));'我个人不喜欢给用户一个选项来清除所有旧数据的想法 –

+0

@LordFarquaad嗯,如果我做了一个filechooser,他们可以选择保存到一个新的文件呢?不知道在这种情况下,我可以让他们追加它吗? – SkyPlus

相关问题