2015-02-24 2 views
4

Я пытался кое-что попробовать в Swing (Java), но получаю очень странные результаты.BufferedWriter не пишет новую строку в файле для String с добавлением к ней « n»

Я получаю строку от JTextArea.getText() и добавляю к ней "\ n". Эта результирующая строка, которую я пишу в файл, использует BufferedWriter, который связывает FileOutputStream с файлом. Но новый символ строки «\ n» не создает новую строку в TXT-файле.

Как исправить эту проблему?

Мой код здесь:

package quizCardGame; 

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

public class QuizCardBuilder extends JFrame { 
private static final long serialVersionUID = 1L; 

private JTextArea question; 
private JTextArea answer; 
private Font font; 
private ArrayList<QuizCard> deck; 
private int countOfDeck; 
private JLabel countLable; 

public QuizCardBuilder() { 
    super(); 
    deck = new ArrayList<QuizCard>(); 
    buildGUI(); 

} 

public static void main(String[] args) { 
    QuizCardBuilder app = new QuizCardBuilder(); 
} 

public void buildGUI() { 
    font = new Font(Font.SERIF, Font.BOLD, 12); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JPanel panel = new JPanel(); 
    this.getContentPane().add(BorderLayout.CENTER, panel); 

    JPanel stats = new JPanel(); 
    countLable = new JLabel("Count: " + countOfDeck); 
    stats.add(countLable); 

    this.getContentPane().add(BorderLayout.SOUTH, stats); 

    JLabel qLable = new JLabel("Question"); 
    panel.add(qLable); 

    question = new JTextArea(5, 30); 
    question.setLineWrap(true); 
    question.setWrapStyleWord(true); 
    question.setFont(font); 

    JScrollPane qScroller = new JScrollPane(question); 
    qScroller 
      .setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
    qScroller 
      .setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 

    panel.add(qScroller); 

    JLabel aLable = new JLabel("Answer"); 
    panel.add(aLable); 

    answer = new JTextArea(5, 30); 
    answer.setLineWrap(true); 
    answer.setWrapStyleWord(true); 
    answer.setFont(font); 

    JScrollPane aScroller = new JScrollPane(answer); 
    aScroller 
      .setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 
    aScroller 
      .setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 

    panel.add(aScroller); 

    JButton nextButton = new JButton("Next"); 
    nextButton.addActionListener(new NextCardListener()); 

    panel.add(nextButton); 

    JMenuBar menuBar = new JMenuBar(); 
    JMenu fileMenu = new JMenu("File"); 
    JMenuItem newMenuItem = new JMenuItem("New"); 
    JMenuItem saveMenuItem = new JMenuItem("Save"); 

    fileMenu.add(newMenuItem); 
    fileMenu.add(saveMenuItem); 
    menuBar.add(fileMenu); 
    this.setJMenuBar(menuBar); 

    newMenuItem.addActionListener(new NewMenuListener()); 
    saveMenuItem.addActionListener(new SaveMenuListener()); 

    this.setSize(350, 350); 
    this.setVisible(true); 
} 

public class SaveMenuListener implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     deck.add(new QuizCard(question.getText(), answer.getText())); 

     JFileChooser fileSave = new JFileChooser(); 
     fileSave.showSaveDialog(null); 
     saveFile(fileSave.getSelectedFile()); 
    } 

} 

public void saveFile(File file) { 

    try { 
     BufferedWriter bw = new BufferedWriter(new FileWriter(file)); 
     for (QuizCard card : deck) { 
      bw.write(card.getQuestion() + "/"); 
      bw.write(card.getAnswer() + "\n"); 
     } 

     bw.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

public class NewMenuListener implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     deck.clear(); 
     countOfDeck = deck.size(); 
     countLable.setText("Count: " + countOfDeck); 
     clearText(); 
    } 

} 

public class NextCardListener implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     deck.add(new QuizCard(question.getText(), answer.getText())); 
     countOfDeck = deck.size(); 
     countLable.setText("Count: " + countOfDeck); 
     clearText(); 
    } 

} 

private void clearText() { 
    question.setText(""); 
    answer.setText(""); 
} 

} 

ответ

6

Использование вместо BufferedWriter.newLine() которых:

Пишет разделитель строки. Строка разделителя строк определяется системным свойством line.separator и равна не обязательно одним символом новой строки ('\ n').

+2

Как в MacOS и Linux '' \ n "' является новой строкой, а в Windows '' \ r \ n "'. Вы увидите единственное '' \ n "' с помощью Write или Word. –

+1

@JoopEggen Вот почему мне нравится оставлять его в API или системном свойстве. (.. Так что мне не нужно помнить подробности!) –

+0

@ Andrew Спасибо. Это сработало. Спасибо за объяснение. – user3769778