2016-08-12 2 views
1

У меня есть программа, которая в настоящее время открывает графический интерфейс и позволяет пользователю вводить свое имя, а также языки, которые они знают. Когда нажата кнопка «Отправить», она затем транслируется на консольный вывод, а также файл блокнота при запуске как исполняемый JAR-файл. Моя проблема заключается в том, что каждый раз, когда я закрываю программу и снова ее открываю, удаляются предыдущие сохраненные выходы. Как бы я обходил это?Как я могу создать свою программу для создания нового имени выходного файла каждый раз, когда он будет вновь открыт?

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

    } 
} 

Спасибо за ваше время.

+0

Также рассмотрите 'java.util.prefs.Preferences', для [example] (http://stackoverflow.com/a/34616583/230513). – trashgod

ответ

0

Вы можете создавать разные имена файлов каждый раз, добавляя имя пользователя в файл с именем say "report_" + их имя.

EDIT: Я прочитал ваш код еще немного. Вот забавная вещь, которая, возможно, лучший способ обработать ваш выход.

Вы можете уменьшить количество раз, когда вы вызываете System.out, но просто добавляете все, что хотите вывести, к запущенной строке (с символами новой строки), а затем просто вызываете 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, но я положил его на всякий случай, вам нужно бросить count к String.

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 output = new PrintStream (новый FileOutputStream (« Report.txt », appendData.isSelected()));« Мне лично не нравится идея предоставить пользователю возможность уничтожить все старые данные, хотя –

+0

@LordFarquaad hmm, что делать, если я сделал filechooser, чтобы они могли выбрать сохранение в новый файл? Не знаете, где я могу позволить им добавить его, хотя в этой ситуации? – SkyPlus

Смежные вопросы