2015-01-29 3 views
0

Я несколько секунд стучал головой о стену, пытаясь заставить мою программу работать, но безуспешно.Java - JFrame, сохраняющая несколько строк

Я работаю над простой программой на основе JFrame, которая должна открыть окно, позволить мне вводить переменные, а затем, если я нажму «Сохранить», сохраните их в выбранном CSV-файле.

Проблема возникает, когда я пытаюсь сохранить 2 или более наборов переменных, первая всегда перезаписывается и появляется только новая.

Например, вместо:

Марк, 100, 2, John, 50, 1

В файле я только найти

John 50, 1

Я угадывая, что это связано с созданием нового буферизатора при каждом нажатии кнопки «Сохранить», но я понятия не имею, как обойти это, я пробовал несколько позиций размещения, но он никогда не работает, потому что я получаю сообщение об ошибке, если оно находится за пределами действия метод.

Вот код:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 

/** 
* Demonstrates etc 
*/ 
public class Homework1 extends JFrame implements ActionListener { 

    JTextField jtfName1; 
    JTextField jtfName2; 
    JTextField jtfName3; 
    JTextField jtfName4; 

    static File file = new File("121Lab1.csv"); 

    public Homework1() { 
     // Set BorderLayout with horizontal gap 5 and vertical gap 10 
     setLayout(new BorderLayout(10, 10)); 


     // Create a JPanel with FlowLayout for the South of the JFrame's BorderLayout 

     JPanel jpSouth = new JPanel(new FlowLayout(FlowLayout.CENTER, 20, 3)); 

     // Create some buttons to place in the south area 
     JButton jbCalc = new JButton("Calculate"); 
     JButton jbSave = new JButton("Save"); 
     JButton jbClear = new JButton("Clear"); 
     JButton jbExit = new JButton("Exit"); 

     jpSouth.add(jbCalc); 
     jpSouth.add(jbSave); 
     jpSouth.add(jbClear); 
     jpSouth.add(jbExit); 

     jbCalc.addActionListener(this); 
     jbSave.addActionListener(this); 
     jbClear.addActionListener(this); 
     jbExit.addActionListener(this); 


     // Place the south panel in the JFrame's south area 
     add(jpSouth, BorderLayout.SOUTH); 

     // Add textfields to the rest of the frame 

     JPanel jpCenter = new JPanel(new GridLayout(0,2)); 

     jpCenter.add(new JLabel("Item name: ", SwingConstants.RIGHT)); 
     jtfName1 = new JTextField("", 10); 
     jpCenter.add(jtfName1); 
     jtfName1.addActionListener(this); 

     jpCenter.add(new JLabel("Number of: ", SwingConstants.RIGHT)); 
     jtfName2 = new JTextField("", 10); 
     jpCenter.add(jtfName2); 
     jtfName2.addActionListener(this); 

     jpCenter.add(new JLabel("Cost: ", SwingConstants.RIGHT)); 
     jtfName3 = new JTextField("", 10); 
     jpCenter.add(jtfName3); 
     jtfName3.addActionListener(this); 

     jpCenter.add(new JLabel("Amount owed: ", SwingConstants.RIGHT)); 
     jtfName4 = new JTextField("", 10); 
     jpCenter.add(jtfName4); 
     jtfName4.addActionListener(this); 

     add(jpCenter, BorderLayout.CENTER); 

    } 

    public void actionPerformed(ActionEvent ae) { 
     String actionString = ae.getActionCommand(); // gets the string on the component 
     Object actionObj = ae.getSource(); 


     if (actionString.equalsIgnoreCase("Calculate")) { // ae.getSource() == jbCancel 
     System.out.println("You clicked Calculate"); 
     try { 
      double value = Double.parseDouble(jtfName2.getText())*Double.parseDouble(jtfName3.getText()); 
      jtfName4.setText(String.format("%.2f", value)); 
     } 
     catch (NumberFormatException nfe) { 
      jtfName4.setText("Not a number"); 
     } 

     } 
     else if (actionString.equalsIgnoreCase("Save")) { 

     try { 
      BufferedWriter writer = new BufferedWriter(new FileWriter(file)); 
      writer.write(jtfName1.getText()+","); 
      writer.write(jtfName2.getText()+","); 
      writer.write(jtfName3.getText()+"\r\n"); 
      writer.flush(); 
      writer.close(); 
     } 
     catch(IOException e) { 
      System.out.println("IO Error"); 
     }   
     } 
     else if (actionString.equalsIgnoreCase("Clear")) { 

     System.out.println("You clicked Clear"); 
     jtfName1.setText(""); 
     jtfName2.setText(""); 
     jtfName3.setText(""); 
     jtfName4.setText(""); 

     } 
     else if (actionString.equalsIgnoreCase("Exit")) { 


     setVisible(false); 
     dispose(); 


     } 
     else { 
     System.out.println("Unknown command: " + actionString); 
     System.out.println("Unknown source: " + actionObj); 
     } 
    } 




    public static void main(String[] args) throws IOException { 

     Homework1 jfMain = new Homework1(); 
     jfMain.setTitle("Item Order Calculator"); 
     jfMain.setSize(450, 200); 
     jfMain.setLocationRelativeTo(null);  // Center JFrame 
     jfMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jfMain.setVisible(true); 


    } // end main 
} // end class JPanelTester 

ответ

1

Каждый раз, когда вы щелкаете save, файл, и это содержание было перезаписаны. Вы должны сказать FileWriter, что вы хотите добавить в конец файла, к примеру ...

BufferedWriter writer = new BufferedWriter(new FileWriter(file), true); 

См FileWriter(File, boolean) для более подробной информации

BufferedWriter также имеет метод newLine, который может написать новая строка к файлу ...

writer.write(jtfName1.getText()+","); 
writer.write(jtfName2.getText()+","); 
writer.write(jtfName3.getText()); 
writer.newLine(); 

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

К счастью, в Java 7+, это очень легко управлять этими типами ресурсов

try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { 
     writer.write(jtfName1.getText()+","); 
     writer.write(jtfName2.getText()+","); 
     writer.write(jtfName3.getText()); 
     writer.newLine(); 
    } 
    catch(IOException e) { 
     System.out.println("IO Error"); 
    }  

См The try-with-resources Statement для более подробной информации

0

я предлагаю вам еще один писатель (я работал над этим):

try{ 

PrintWriter Writer = new PrintWriter(new File("path of file/file.(whatever)"); 

    //example 
     writer.write(jtfName1.getText()+","); 
     writer.printf(" "); //Leave some space 
     writer.write(jtfName2.getText()+","); 
     writer.printf(" "); //Leave some space 
     writer.write(jtfName3.getText()+"\r\n"); 
     writer.printf(" "); //Leave some space 

     writer.flush(); 
     writer.close(); 

} catch (FileNotFoundException e) { e.printStackTrace(); } 

если вы хотите оставить какое-то место или написать что-нибудь, используйте: writer.printf (".");

если вы хотите оставить сообщение, используйте writer.println();

Конечно, у него есть и другие функции, которые можно использовать с автором.

Позвольте мне знать, если он делает свою работу .....

+0

Там нет ничего плохого с помощью 'Writer' и, насколько ваш пример идет, 'PrintWriter' на самом деле не добавляет никаких функций, которые OP еще не имеет (если вы форматируете' String 'каким-то образом, это может быть иначе). Это все равно будет записывать только последний контент, который OP пишет файл, перезаписывая содержимое ... – MadProgrammer

+0

для сохранения, что вопрос нужен, он выполняет эту работу, я использую ее для сохранения данных в программе, которую я делаю .. (it добавьте контент один за другим, который он также может добавить), он/она может преобразовать его, чтобы сделать это. Я знаю, что BufferReader - один хороший вариант, но я не работал с этим слишком много, поэтому я предлагаю это .. – crAlexander

+0

То же самое здесь , Я обычно использую '' Writer'' над 'PrintWriter' лично, если бы вы могли сказать, что он поддерживает лучшую кодировку символов или что-то в этом роде, тогда это будет хорошо, но просто говоря:« вы должны использовать это, потому что я делаю », это не действительно хорошая причина для изменения ОП - ИМХО. – MadProgrammer

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