Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 33
  1. #1

    Differenziare testo in JTeaxtArea

    salve. ho questo piccola classe che mi lista tutte le directory/subdir e file in una determinata directory.
    la classe viene richiamata da un jframe e riempie una jtextarea.
    ora, vorre fare in modo che le directory vengano differenziate meglio dai files.
    che ne so, tutto maiuscolo anche andrebbe bene.
    solo che nn mi viene in mente come visto che il codice nn è all'interno della jtextarea:
    codice:
    public class ListDir {
    
        private static void listingDir(File dir, int livello, StringBuilder sb) {
            String spazio = "";
            File[] elementi = dir.listFiles();
            for (int l = 0; l < livello; l++) {
                spazio += "  |_";
            }
            Arrays.sort(elementi, new myComparator());
            for (File files : elementi) {
                sb.append(spazio).append(files.getName()).append("\n");
                if (files.isDirectory()) {
                    listingDir(files, livello + 1, sb);
                }
            }
        }
    
        public static StringBuilder sortList(File dir) throws FileNotFoundException {
            StringBuilder sb = new StringBuilder();
            listingDir(dir, 0, sb);
            return sb;
        }
    }
    avete qualche suggerimento?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Differenziare testo in JTeaxtArea

    Originariamente inviato da fermat
    che ne so, tutto maiuscolo anche andrebbe bene.
    Se volessi usare anche dei colori, però dovresti usare JTextPane ma dovresti rinunciare ad usare StringBuilder.

    Originariamente inviato da fermat
    solo che nn mi viene in mente come visto che il codice nn è all'interno della jtextarea
    Scusa ma non ho capito questa tua frase.

    Cambia un pochino la logica di stampa "ricorsiva" e fai in modo di stampare in modo "evidenziato" (qualunque evidenziazione scegli) il nome della directory quando si entra in listingDir.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    intendevo dire che nel jtextpane (come da suggerito) posso ad esempio impostare il colore del carattere con:
    setForeground(new java.awt.Color(0, 102, 102));

    di certo nn lo posso fare nella classe che lista le directory.


    ps: perchè dovrei rinunciare a StringBuilder per usare JTextPane?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fermat
    intendevo dire che nel jtextpane (come da suggerito) posso ad esempio impostare il colore del carattere con:
    setForeground(new java.awt.Color(0, 102, 102));
    No, per testo "stilizzato" bisogna lavorare su uno StyledDocument (DefaultStyledDocument la implementazione predefinita).

    Originariamente inviato da fermat
    di certo nn lo posso fare nella classe che lista le directory.
    Sì se invece di un StringBuffer/Builder vai a popolare man mano lo StyledDocument.

    Originariamente inviato da fermat
    ps: perchè dovrei rinunciare a StringBuilder per usare JTextPane?
    Perché gli "attributi" degli stili sono proprietà particolari negli Element di uno StyledDocument, non è un qualcosa che puoi rappresentare in una stringa di testo puro.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    ok mi sono fatto un'idea.
    però visto che nn posso usare StringBuilder/Buffer posso usare solo String?
    ma per quello che devo fare nn è poco performante??

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fermat
    ok mi sono fatto un'idea.
    però visto che nn posso usare StringBuilder/Buffer posso usare solo String?
    Allora chiariamo: il "modello ad oggetti" su cui JEditorPane/JTextPane si basano è fatto di oggetti speciali che sono: un "document" (interfaccia Document, sottotipi e implementazioni varie), gli "element" (interfaccia Element e implementazioni) e gli "attribute" (interfaccia AttributeSet, sottotipi e implementazioni varie).
    Se vuoi usare direttamente questi, non ti basta certo un String. Tipicamente si usa la classe SimpleAttributeSet per gestire gli attributi, li devi aggiungere espressamente con dei metodi (in genere quelli di StyleConstants) poi devi aggiungere del testo nel document specificando gli attributi (e per certi metodi da un offset per tot di lunghezza), ecc...
    Questo è al livello più basso.

    Ma con JEditorPane/JTextPane si possono anche leggere/scrivere documenti in formato HTML e RTF. Per "documento" adesso si intende o un file fisico, un InputStream generico o anche un String. Ma se vuoi lavorare a questo livello devi generare una sequenza di testo con codice HTML o RTF corretto (con tutto quello che comporta: tag corretti, escape di caratteri speciali, ecc...). E ci penserebbe poi il XyzEditorKit a "parsare" il documento e a generare tutti gli Element e AttributeSet necessari.

    I due livelli sono praticamente come quello che succede nei browser. Leggono un documento HTML che è di per sé testo ma lo parsano e generano tutto il DOM, il modello ad oggetti che viene tenuto in memoria.

    Se vuoi aggiungere a basso livello del testo blu al fondo di uno StyledDocument, devi fare ad esempio:

    codice:
    SimpleAttributeSet attr = new SimpleAttributeSet();
    StyleConstants.setForeground(attr, Color.BLUE);
    tuoStyledDoc.insertString(styledDoc.getLength(), "questo è blu", attr);
    Lo vedi bene che non tutto è in String. Il contenuto (testo puro che viene poi stilizzato) è un String.

    Non servirebbe mettere in quella stringa roba HTML es. "<font color='blue'>questo è blu</font>" perché nel componente tu leggeresti proprio questa stringa. Non la capisce a quel livello. È una stringa di testo puro che poi viene stilizzata visivamente grazie agli AttributeSet.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    ah ok adesso ci sono perfettamente....
    bhe vedo un pò allora perchè in realtà fare tutto sto casino per quella cosa nn ne vale la pena.
    sarebbe più a scopo didattico = tempo che purtroppo per nn ho.
    grazie mille per le delucidazioni!!

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fermat
    bhe vedo un pò allora perchè in realtà fare tutto sto casino per quella cosa nn ne vale la pena.
    Perché no? Quello che inseriresti nel document è testo con caratteristiche altamente "ripetitive", nel senso che la scansione delle directory è ricorsiva e a parte la eventuale indentazione (che cambia livello per livello), tutto il resto è praticamente ricorrente e hai solo da specializzare due cose: la rappresentazione di una directory e di un file.

    Senza contare che la logica di gestione del document e degli attributi la potresti anche incapsulare in una classe separata.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    ok in pratica mi stai dicendo di creare un classe che rappresenta uno StyledDocument e poi settare questo document come predefinito nel JTextPane, giusto?
    se è così ho iniziato a creare una classe ma ho qualche dubbio:
    codice:
    public class myStyleDocument extends DefaultStyledDocument {
    
        public void createStyle() throws BadLocationException {
            StyledDocument document = new DefaultStyledDocument();
            SimpleAttributeSet attributes = new SimpleAttributeSet();
            attributes.addAttribute(StyleConstants.CharacterConstants.Bold, Boolean.TRUE);
            attributes.addAttribute(StyleConstants.CharacterConstants.Foreground, Color.BLUE);
            document.insertString(document.getLength(), null, attributes); // METTERE LE DIRECTORY
    
            attributes = new SimpleAttributeSet();
            attributes.addAttribute(StyleConstants.CharacterConstants.Italic, Boolean.TRUE);
            attributes.addAttribute(StyleConstants.CharacterConstants.Foreground, Color.BLACK);
            document.insertString(document.getLength(), null, attributes); // METTERE I FILES
        }
    }
    quello che nn mi viene è come aggiungere il testo che rappresenta file e directory.
    cioè, posso usare qua StringBuilder e aggiungere il testo richiamando i metodi che ho scritto a inizio discussione?
    o devo modificarli per usare solo String?
    o ho sbagliato tutto??

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fermat
    ok in pratica mi stai dicendo di creare un classe che rappresenta uno StyledDocument e poi settare questo document come predefinito nel JTextPane, giusto?
    Con l'ultima mia frase di prima sì, dicevo una cosa del genere. Cioè separare la logica di scansione del file-system dalla logica di gestione del testo "stilizzato".

    Originariamente inviato da fermat
    se è così ho iniziato a creare una classe ma ho qualche dubbio:

    quello che nn mi viene è come aggiungere il testo che rappresenta file e directory.
    cioè, posso usare qua StringBuilder e aggiungere il testo richiamando i metodi che ho scritto a inizio discussione?
    o devo modificarli per usare solo String?
    o ho sbagliato tutto??
    Ehm .... no. Io non pensavo e intendevo certo per "estensione" ma per "incapsulamento"!

    Grosso modo:

    codice:
    public class DirTreeStyledDocBuilder {
        private StyledDocument styledDoc;
        private SimpleAttributeSet dirAttrs;
        private SimpleAttributeSet fileAttrs;
    
        ......
    
        public void insertDir(String dir, int level) { ....... }
    
        public void insertFile(String dir, int level) { ....... }
    
        public StyledDocument getStyledDocument() {
            return styledDoc;
        }
    }
    Finita tutta la scansione, si prende il StyledDocument con l'ultimo metodo mostrato e lo si passa a JTextPane. Tutto qui.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.