Nie zapisuje stringu do pliku tekstowego

0

Hi, napisałem coś na wzór prostego edytora tekstu. Problem w tym, że nie dochodzi do zapisania zawartość JTextArea do pliku.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package javaapplication37;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

class Frame extends JFrame {
     public Frame() {
          setSize(350, 350);
          setTitle("Edytor");
          setDefaultCloseOperation(EXIT_ON_CLOSE);
          addTextArea();
          createMenu();
     }
     public String readFile(File ff) throws IOException{
          BufferedReader outf = new BufferedReader(new InputStreamReader(new FileInputStream(ff)));
          String text = "";
          String line;
          
          while((line = outf.readLine()) != null ) {
               text += line + System.getProperty("line.separator");
          }
          outf.close();
          return text;
     }
     public void saveFile(File ifile, String text) throws FileNotFoundException {
          String[] lines = text.split(System.getProperty("line.separator"));
          PrintStream inf = new PrintStream(ifile);
          for (int i = 0; i < lines.length; i++) {
               inf.println(lines[i]);
          }
          inf.close();
     }
     public void addTextArea() {
          Container box = getContentPane();
          editText = new JTextArea();
          sPanel = new JScrollPane(editText);
          box.add(sPanel);
          editText.setLineWrap(true);//zawijanie
          editText.setWrapStyleWord(true);//dzielenie słówn
     }
     public void createMenu() {
          menubar.add(file);
          file.add(newfile);
          newfile.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent e) {
                    String namefile = JOptionPane.showInputDialog(null, "podaj scieżkę i nazwę do pliku");
                    f = new File(namefile);
                    try {
                         if (f.createNewFile()) {
                              JOptionPane.showMessageDialog(null, "Pomyślene utworzenie pliku");
                         }
                         else
                              JOptionPane.showMessageDialog(null, "Bład utworzenie pliku");
                    } catch (IOException ex) {}
               }
          });
          file.add(open);
          open.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent e) {
                    JFileChooser chooser = new JFileChooser();
                    chooser.setMultiSelectionEnabled(false);
                    if(chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
                         try {
                              File f2 = chooser.getSelectedFile();
                              editText.setText(readFile(f2));
                         } catch (IOException ex) {}
                    }
               }
          });
          file.add(save);
          save.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent e) {
                    try {
                         saveFile(f, editText.getText());
                    } catch (FileNotFoundException ex) {}
               }
          });
          file.addSeparator();
          file.add(exit);

          menubar.add(edit);
          edit.add(cut);
          edit.add(copy);
          edit.add(paste);

          setJMenuBar(menubar);
     }

     private File f;
     private JScrollPane sPanel;
     private JTextArea editText;
     private JMenuBar menubar = new JMenuBar();
     private JMenu file = new JMenu("Plik");
     private JMenuItem newfile = new JMenuItem("Nowy");
     private JMenuItem open = new JMenuItem("Otwórz");
     private JMenuItem save = new JMenuItem("Zapisz");
     private JMenuItem exit = new JMenuItem("Koniec");
     private JMenu edit = new JMenu("Edytuj");
     private JMenuItem cut = new JMenuItem("Wytnij");
     private JMenuItem copy = new JMenuItem("Kopiuj");
     private JMenuItem paste = new JMenuItem("Wklej");

}

public class Main {

    public static void main(String[] args) {
       SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                    Frame x = new Frame();
                    x.setVisible(true);
               }
       });
    }

}

Będę wdzięczny za pomoc w ustaleniu gdzie się pomyliłem :).
Pozdrawiam!

0

U mnie działa. Zauważ, że saveFile działa dopiero wtedy, kiedy tworzony jest nowy plik z poziomu aplikacji (bo wtedy dopiero inicjalizowane jest f, inaczej wywala NPE).

0

Rzeczywiście. Dziękuję za pomoc.
Mam jeszcze inne pytanie: mam komponent JEditorPane. Chciałbym móc formatować kod w JEditorPane.
Nie mogę niestety zaleźć żadnego kodu, który pokazuje jak sformatować tekst w tym komponencie. Mam na myśli pogrubienie, pochylenie, podkreślenie tekstu ew. justowanie, środkowanie etc. Znasz może jakaś stronę gdzie można zaleźć przykładowy kod?

Pozdrawiam!

0

JEditorPane pozwala na formatowanie tekstu jako html lub rtf:

JEditorPane editor = new JEditorPane();
editor.setContentType("text/html");
editor.setText("ooooooo <b>pogrubione</b> ooooooo");

Jest to dosyć ubogie, istnieje jednak bardziej wyrafinowana, pozwalająca na nieco więcej, metoda oparta na stylach (do zastosowania z JTextPane, który dziedziczy po JEditorPane):

JTextPane editor = new JTextPane();
Style style = editor.addStyle("pogrubienie", null);
StyleConstants.setBold(style, true);
editor.setText("ooooooo pogrubione ooooooo");
editor.getStyledDocument().setCharacterAttributes(8, 10, style, true);
0

Mnie też ciekawi ten temat Edytorów.
A jeżeli ściągamy kod strony to dajemy JEditorPane.setPage() ??

0

setPage pozwala na wczytanie dokumentu z URLa, automatycznie ustawiając odpowiedni contentType. Jak już wcześniej wspomniałem, w przypadku HTMLa nadaje się to do prostych zastosowań (jak edytor tekstu z formatowaniem), ale strony całej nie wczyta - ma np. minimalne wsparcie dla CSS.
// Właśnie zajrzałem w dokumentację: JEditorPane obsługuje HTML 3.2

0

jeśli 'dysponujesz' linkiem do tutka gdzie jest opisane coś więcej niż w dokumentacji to byłbym wdzięczny bo jednak sama dokumentacja to trochę za mało aby nauczyć się
wykorzystywać potencjał JEditorPane'a. Java tutorials też tylko podaje podstawy konstruktorów a książki na ten temat pewnie nie ma :/

0

Czyli jeżeli zrobie stronę w html'u i zrobię sobie prosty edytor to czy wtedy metoda setPage() zadziała ? czy muszę to zrobić za pomocą setText() ponieważ strona tak naprawdę będzie się jeszcze znajdowała na moim kompie.
Czy tu trzeba zrobić ifa i dać 'przekierowanie' do metody readFile() gdzie znalazł by się plik .txt, w przypadku gdybym chciał przeglądać swój kod z kompa ?
Czy po prostu przyjąć że to jest plik z kompa i edytować stronę w taki sposób ? A potem wrzucić do sieci.

1

JS nie działa, plik lokalny też otwierasz przez setPage().

String plik="file:"+pelnaNazwaPliku;
ep.setPage(new URL(plik));

1 użytkowników online, w tym zalogowanych: 0, gości: 1