2016-08-12 28 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

相關問題