Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    30

    Picchiarsi con una JTextArea.

    Salve,
    sto realizzando un editor di testo con Java, con una JTextArea, e premetto che non ho intenzione di cambiarla in un JTextPane perché mi ci sono già picchiata.
    Il mio programma salva e apre tranquillamente file di testo, solo che non "memorizza" il cambio di paragrafo: scrivendo nella JTextArea si può andare a capo, ma se salvo e riapro il file, il testo è tutto attaccato. Non ho idea di come risolvere questo problema, se non con qualche metodo per JTextArea che possa salvarmi o un salvataggio diverso.
    Grazie!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Magari posta anche un po' di codice (le parti di salvataggio e di apertura del file), altrimenti non potremmo mai sapere cosa tu stia sbagliando... perchè di sicuro stai sbagliando qualcosa.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    30
    ho inviato due messaggi per sbaglio, ignorare questo :'D
    Ultima modifica di MadWolf; 08-06-2015 a 11:17

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    30
    Yep
    Qua c'è il codice di salvataggio:
    codice:
    /**
    * Metodo per salvare un file* @param nome - nome del file
    */
    public void salva(String nome){ 
            try {
                FileWriter lettere = new FileWriter(nome+".txt");
                lettere.write(txt.getText());     //scrive in un file
                lettere.close();                //chiude buffer
                }
                catch (IOException e) {
                    System.out.println ("Errore - " + e.toString());
                }
    }
    Qui per l'apertura:
    codice:
    /**
         *  Metodo per aprire un file
         *  @param nome - nome del file
         */
        public void apri(String nome){
        	try{
        		FileReader file=new FileReader(nome);		//nuovo reader col nome del file (path?)
        		BufferedReader buff=new BufferedReader (file);	//creato buffer per leggere dl reader
        		
    	    	boolean eof=false; //eof = end of file, inizializzato a falso per dire che il file non è finito
    			while(!eof){
    				String line=buff.readLine(); 	//readline legge una linea di testo, e la salvo nella stringa line
    				if (line==null )				//se la linea letta è vuota, non viene ripetuto il ciclo 
    					eof=true;
    				else
    					txt.setText(txt.getText()+line);
    			}
    			buff.close();						//chiusura del buffer
    		} catch (IOException e) { System.out.println ("Errore - " + e.toString()); }
    	}
    Qua c'è quel che riguarda la JTextArea:
    codice:
    txt=new JTextArea();
    
    sP=new JScrollPane(txt);
    sP.setPreferredSize(new Dimension(400, 350));
    sP.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    sP.setFont(fc.getFont());
    E questo è il codice eseguito quando si preme "salva":
    codice:
    if(ch.showSaveDialog(f)==JFileChooser.APPROVE_OPTION)
            salva(ch.getCurrentDirectory()+"/"+ch.getSelectedFile().getName());

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ed infatti nella lettura tu elimini tutti gli "A CAPO".

    Il BufferedReader legge a righe eliminando il carattere di ritorno a capo.
    Di conseguenza, se tu fai semplicemente un append della riga letta, stai appiccicando tutto.

    Quello che va fatto è l'append della riga + del carattere di ritorno a capo (System.getProperty("line.separator") o semplicemente "\n");


    codice:
    txt.setText(txt.getText()+line + "\n");

    Tieni presente che il codice, così com'è, non va bene: stai facendo operazioni di I/O nel contesto del EDT... le operazioni di I/O andrebbero svolte in un thread a parte, il quale "si interfaccia" con l'EDT per la modifica dei componenti visuali.

    Mi sono fermato a questo... non ho letto il resto del codice.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    30
    Grazie mille! :3

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    E oltre a quanto ha già precisato LeleFT, io aggiungo:

    1) i close() vanno sempre fatti, in qualunque caso. Serve una gestione più accurata delle eccezioni, che consiste anche nell'uso della clausola "finally".

    2) L'uso del flag eof è abbastanza inutile e più fumoso. Il modo "tipico" per leggere a righe è:

    codice:
    String linea;
    
    while ((linea = buff.readLine()) != null) {
        // usa linea .......
    }
    Stop, tutto qui.

    3) txt.setText(txt.getText()+line);
    è altamente inefficiente
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    30
    Solo che se apro il file con blocconote mi rendo conto che nemmeno salva gli a capo, è nel salvataggio il problema...

  9. #9
    Utente di HTML.it L'avatar di MySQL
    Registrato dal
    May 2015
    Messaggi
    729
    Puoi adottare un metodo brutale ma efficace (non velocissimo ma suppongo che il testo sia piccolo), ovvero sostituisci (prima di salvare) gli a capo con qualcosa del tipo #$$$ e poi quando leggi la stringa, se trovi questo "codice magico", lo re-inserisci

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    30
    Ho risolto così, dove txt è la JTextArea:
    codice:
    FileWriter lettere = new FileWriter(nome+".txt"); 
    String text=txt.getText().replace("\n", System.getProperty("line.separator"));
    lettere.write(text.toString(), 0, text.length());     //scrive in un file
    lettere.close();                //chiude buffer

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.