Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Document

    Devo fare un editor si testo che colori parte del testo (esempio le parole chiave) e mi hanno detto di usare la classe Document.


    Qualcuno saprebbe dirmi se è una buona soluzione?
    Se si mi sapreste dire un pò i metodi di Document per fare la formattazione?


    Grazie.

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Diciamo che è l'unica soluzione.
    Per quanto riguarda il suo utilizzo dovresti leggerti il tutorial della Sun sul modello Document-View e sugli stili (che comunque non è esauriente). Se vuoi informazioni più dettagliate (dato che l'argomento è piuttosto vasto) ti devi rivolgere ai manuali cartacei, dove vengono spiegate minuziosamente le caratteristiche dei JTextcomponents: il migliore credo che sia Java Swing della O'Reilly ( 60 $ ).


    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
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Se può esserti d'aiuto, ho buttato giù qualche righetta di codice d'esempio (molto stupido come programmino, eh...):
    codice:
    import java.io.*;
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import javax.swing.text.*;
    
    public class Testo extends JFrame {
    
       private BufferedReader br;
       private JTextPane jtp;
       private JScrollPane jsp;
       private Container c;
       private StyledDocument doc;
    
       public Testo(String file) {
          
          c = getContentPane();
          c.setLayout( new BorderLayout() );
    
          jtp = new JTextPane();
          jsp = new JScrollPane( jtp );
    
          creaStili( jtp.getStyledDocument() );
    
          doc = jtp.getStyledDocument();
    
          c.add(jsp, BorderLayout.CENTER);
    
          caricaFile(file);
    
          setDefaultCloseOperation( EXIT_ON_CLOSE );
          setSize(800, 600);
          setResizable( false );
          setTitle("Guarda la casa");
          setVisible( true );
       }
    
       private void caricaFile(String file) {
          try {
             br = new BufferedReader( new InputStreamReader( new FileInputStream(file) ) );
             String linea = "";
             while((linea = br.readLine()) != null) {
                printaTesto( linea );
             }
             br.close();
          } catch (Exception e) { e.printStackTrace(); }
       }
    
       private void printaTesto(String linea) throws Exception {
          String[] tokens = linea.split(" ");
          String prima = "";
          String dopo = "";
          String content = "";
          int pos = 0;
          for(int id=0; id<tokens.length; id++) {
             if ( tokens[id].toLowerCase().indexOf("casa") >= 0 ) {
                pos = tokens[id].toLowerCase().indexOf("casa");
                prima = tokens[id].substring(0,pos);
                dopo = tokens[id].substring(pos+4,tokens[id].length());
                content = tokens[id].substring(pos, pos+4);
                doc.insertString(doc.getLength(), prima, doc.getStyle("normale"));
                doc.insertString(doc.getLength(), content, doc.getStyle("casa"));
                doc.insertString(doc.getLength(), dopo, doc.getStyle("normale"));
             } else {
                doc.insertString(doc.getLength(), tokens[id], doc.getStyle("normale"));
             }
             doc.insertString(doc.getLength(), " ", doc.getStyle("normale"));
          }
          doc.insertString(doc.getLength(), "\n", doc.getStyle("normale"));
       }
    
       private void creaStili(StyledDocument sd) {
          Style deflt = StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE);
    
          // Stile normale
          Style normale = sd.addStyle("normale", deflt);
          StyleConstants.setFontFamily(deflt, "Arial");
          StyleConstants.setForeground(deflt, Color.black);
          StyleConstants.setFontSize(deflt, 12);
    
          // Stile "casa"
          Style s = sd.addStyle("casa", normale);
          StyleConstants.setItalic(s, true);
          StyleConstants.setUnderline(s, true);
          StyleConstants.setForeground(s, Color.blue);
          StyleConstants.setFontSize(s, 11);
       }
    
       public static void main(String [] args) {
          if (args.length > 0) {
             Testo t = new Testo( args[0] );
          }
       }
    }
    Come si usa: lo compili normalmente e lo avvii in questo modo:
    codice:
    java Testo nomeFile
    dove nomeFile è il nome di un file di testo qualsiasi. Per vederne gli effetti è necessario che il file di testo contenga al suo interno la parola casa (una o più volte, non necessariamente tutta in minuscolo; il file più comodo è il sorgente stesso ). Se il file di testo non è nella stessa directory dell'applicazione è necessario passargli tutto il percorso.


    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

  4. #4
    grazie mille, dopo provo.

    Speriamo di riuscirci perchè mi serve per l'università

  5. #5
    Scusa se ti rompo ancosa ma mi potresti spiegare cosa fanno queste istruzioni?

    1- if ( tokens[id].toLowerCase().indexOf("casa") >= 0 )
    2- Style deflt = StyleContext.getDefaultStyleContext().getStyle(Sty leContext.DEFAULT_STYLE);

    Grazie per la pazienza

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Scusa se ti rompo ancosa ma mi potresti spiegare cosa fanno queste istruzioni?

    1- if ( tokens[id].toLowerCase().indexOf("casa") >= 0 )
    2- Style deflt = StyleContext.getDefaultStyleContext().getStyle(Sty leContext.DEFAULT_STYLE);

    Grazie per la pazienza
    La prima istruzione va vista in funzione dell'istruzione all'inizio del metodo:
    codice:
    String[] tokens = linea.split(" ");
    Questa istruzione spezzetta la linea di testo appena letta dal file dove ci sono gli spazi (in pratica, crea un array con tutte le parole).
    Quindi, l'istruzione incriminata controlla se all'interno della "parola" i-esima c'è la parola casa.

    La seconda istruzione, invece, serve per ottenre lo stile di default, al quale applicare i modificatori per ottenere lo stile desiderato.


    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

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    104
    io devo fare un programma simile a quello dell'altro ragazzo ed ho provato ad usare il codice pubblicato leggermente modificato in questo modo:

    queste 2 funzioni le ho lasciate paripari:

    private void printaTesto(String linea) throws Exception {
    String[] tokens = linea.split(" ");
    String prima = "";
    String dopo = "";
    String content = "";
    int pos = 0;
    for(int id=0; id<tokens.length; id++) {
    if ( tokens[id].toLowerCase().indexOf("casa") >= 0 ) {
    pos = tokens[id].toLowerCase().indexOf("casa");
    prima = tokens[id].substring(0,pos);
    dopo = tokens[id].substring(pos+4,tokens[id].length());
    content = tokens[id].substring(pos, pos+4);
    doc.insertString(doc.getLength(), prima, doc.getStyle("normale"));
    doc.insertString(doc.getLength(), content, doc.getStyle("casa"));
    doc.insertString(doc.getLength(), dopo, doc.getStyle("normale"));
    } else {
    doc.insertString(doc.getLength(), tokens[id], doc.getStyle("normale"));
    }
    doc.insertString(doc.getLength(), " ", doc.getStyle("normale"));
    }
    doc.insertString(doc.getLength(), "\n", doc.getStyle("normale"));
    }

    private void creaStili(StyledDocument sd) {
    Style deflt = StyleContext.getDefaultStyleContext().getStyle(Sty leContext.DEFAULT_STYLE);

    // Stile normale
    Style normale = sd.addStyle("normale", deflt);
    StyleConstants.setFontFamily(deflt, "Arial");
    StyleConstants.setForeground(deflt, Color.black);
    StyleConstants.setFontSize(deflt, 12);

    // Stile "casa"
    Style s = sd.addStyle("casa", normale);
    StyleConstants.setItalic(s, true);
    StyleConstants.setUnderline(s, true);
    StyleConstants.setForeground(s, Color.blue);
    StyleConstants.setFontSize(s, 11);
    }

    mentre questi metodi li ho richiamati dove settavo gli oggetti dell'editor

    creaStili( AreaEditor.getStyledDocument() );
    doc = AreaEditor.getStyledDocument();

    e per usare la funzione printaTesto io la richiamo qui dentro,ovvero nei metodi della classe che leggono gli eventi quando digito un testo in questo modo:


    class UpdateListener implements DocumentListener{
    private boolean textChange = false;
    private int offs = 0;

    public void insertUpdate(DocumentEvent e) {
    String[] testoTemp;
    String linea;
    linea = AreaEditor.getText();
    try {
    printaTesto(linea);
    } catch (Exception e2) {
    // TODO Auto-generated catch block
    e2.printStackTrace();
    }
    textChange = true;
    }
    }

    solo che quando digito anche solo una lettera il compilatore mi da questi errori:

    java.lang.IllegalStateException: Attempt to mutate in notification
    at javax.swing.text.AbstractDocument.writeLock(Unknow n Source)
    at javax.swing.text.AbstractDocument.insertString(Unk nown Source)
    at provap.Editor.printaTesto(Editor.java:404)
    at provap.Editor.access$1(Editor.java:388)
    at provap.Editor$UpdateListener.insertUpdate(Editor.j ava:458)
    at javax.swing.text.AbstractDocument.fireInsertUpdate (Unknown Source)
    at javax.swing.text.AbstractDocument.handleInsertStri ng(Unknown Source)
    at javax.swing.text.AbstractDocument.insertString(Unk nown Source)
    at javax.swing.text.AbstractDocument.replace(Unknown Source)
    at javax.swing.JTextPane.replaceSelection(Unknown Source)
    at javax.swing.JTextPane.replaceSelection(Unknown Source)
    at javax.swing.text.DefaultEditorKit$DefaultKeyTypedA ction.actionPerformed(Unknown Source)
    at javax.swing.SwingUtilities.notifyAction(Unknown Source)
    at javax.swing.JComponent.processKeyBinding(Unknown Source)
    at javax.swing.JComponent.processKeyBindings(Unknown Source)
    at javax.swing.JComponent.processKeyEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.KeyboardFocusManager.redispatchEvent(Unkn own Source)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEv ent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKe yEvent(Unknown Source)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAsse rtions(Unknown Source)

    come mai??? l'unica differenza tra l'esempio pubblicato ed il mio progetto è che li legge riga
    per riga un file io invece leggo nella stringa tutto quello che è scritto nell'editor

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.