Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - JTextPane or JTextEditor to solve html problems
Forum - Java - JTextPane or JTextEditor to solve html problems

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
killer (Normal User)
Expert


Messaggi: 217
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 16:31
Mercoledì, 08/02/2012
Salve a tutti... ho un problema a quanto strano...
Sto sviluppando una chat.
Dovrei visualizzare in uno dei due components jtextpane o jtexteditor( mi consigliate voi ) i messaggi provenienti da altri client con un colore o un font scelto dall'utente.
Ovviamente vorrei 1)che ogni text venga visualizzato con i loro attributi a capo senza cancellare i text precedenti( mantenendo i loro colori e font )
2)devo ovviamente personalizzare il text con codice html
3)il testo deve andare a capo quando arriva al margine. come fare tutto questo ? ho molta confusione a riguardo. ho provato a scrivere la seguente funzione senza risultato.cosa sbaglio !? Fatemi sapere presto
Codice sorgente - presumibilmente Java

  1. public void insertIntoTextPane(String htmltext) {
  2.        getTextPane().setContentType("text/html");
  3.         try {
  4.             HTMLEditorKit kit = new HTMLEditorKit();
  5.             getTextPane().setEditorKit(kit);
  6.             HTMLDocument doc = new HTMLDocument();
  7.             getTextPane().setDocument(doc);
  8.             kit.insertHTML(doc, doc.getLength(),htmltext,0, 0, null);
  9.         } catch (BadLocationException | IOException e) {
  10.         }
  11. }



Error:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1
    at javax.swing.text.BoxView.getOffset(BoxView.java:1101)
    at javax.swing.text.BoxView.paint(BoxView.java:420)
    at javax.swing.text.html.BlockView.paint(BlockView.java:282)
    at javax.swing.plaf.basic.BasicTextUI$RootView.paint(BasicTextUI.java:1436)
    at javax.swing.plaf.basic.BasicTextUI.paintSafely(BasicTextUI.java:739)
    at javax.swing.plaf.basic.BasicTextUI.paint(BasicTextUI.java:883)
    at javax.swing.plaf.basic.BasicTextUI.update(BasicTextUI.java:862)
    at javax.swing.JComponent.paintComponent(JComponent.java:778)
    at javax.swing.JComponent.paint(JComponent.java:1054)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1482)
    at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1413)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1206)
    at javax.swing.JComponent._paintImmediately(JComponent.java:5169)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4980)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:770)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728)
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677)
    at javax.swing.RepaintManager.access$700(RepaintManager.java:59)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
    at java.awt.EventQueue.access$000(EventQueue.java:101)
    at java.awt.EventQueue$3.run(EventQueue.java:666)
    at java.awt.EventQueue$3.run(EventQueue.java:664)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

PM Quote
Avatar
Bonny (Member)
Expert


Messaggi: 437
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 21:21
Mercoledì, 08/02/2012
Secondo me basta usare un JTextPane e settare la proprietà setEditorKit per l'html per esempio:
Codice sorgente - presumibilmente Java

  1. class Finestra extends JFrame{
  2.  
  3.      private JTextPanel txtarea;
  4.      public Finestra(){
  5.               txtarea = new JTextArea();
  6.               txtarea.setEditorKit(new HTMLEditorKit());
  7.               this.getContentPane().add(txtarea);
  8.      }
  9.    
  10. }


quindi quando inserisci delle stringhe sulla txtarea, interpreta anche il codice Html
esempio
Codice sorgente - presumibilmente Java

  1. String html = "<b>ciao mondo</b>";
  2. txtarea.setText(txtarea.getText() + "\n" + html);


il risultato finale sara: ciao mondo  ovviamente all'interno del JTextPane

Ultima modifica effettuata da Bonny il 08/02/2012 alle 21:22
PM Quote
Avatar
killer (Normal User)
Expert


Messaggi: 217
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 11:06
Giovedì, 09/02/2012
uhm ho provato non funziona. cmq ci sono riuscito ho trovato la soluzione e la posto:
Codice sorgente - presumibilmente Java

  1. Document doc = getEditorPane().getDocument();
  2.         if (doc != null) {
  3.             EditorKit ek = getEditorPane().getEditorKit();
  4.             if (ek instanceof HTMLEditorKit && doc instanceof HTMLDocument) {
  5.                 try {
  6.                     ((HTMLEditorKit) ek).insertHTML((HTMLDocument) doc, doc.getEndPosition().getOffset() - 1, data, 1, 0, null);
  7.                 } catch (BadLocationException | IOException ex) {
  8.                 }
  9.             } else {
  10.                 try {
  11.                     doc.insertString(doc.getEndPosition().getOffset() - 1, data + "\n", null);
  12.                 } catch (BadLocationException ex) {
  13.                 }
  14.             }
  15.         }



Però mi sorge una domanda... se io volessi visualizzare nell' EditorPane un'immagine come devo fare ? ho provato con :
Codice sorgente - presumibilmente Plain Text

  1. <html><img src='path + nomefilecompleto' alt='titolo immagine'/></html>

e non funziona... ti spiego il percorso (in java)dell'immagine è
src/images/heart.png    
Ho provato in tal modo ma non la carica. sapresti aiutarmi ?

Ultima modifica effettuata da killer il 09/02/2012 alle 11:09
PM Quote
Avatar
Bonny (Member)
Expert


Messaggi: 437
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 13:09
Giovedì, 09/02/2012
Se usi NetBeans in teoria dovresti avere le directory in questo ordine
mioprogetto->src->mioprogetto->images & file.java
e
mioprogetto->build->classes->mioprogetto->file.class

di solito io inserisco la cartella images anche dove dei file .class cosi
mioprogetto->build->classes->mioprogetto->file.class & images
(in questo modo quando crei il .jar la cartella image viene copiata all'interno di esso)
per usarle nella app per esempio:
Codice sorgente - presumibilmente Java

  1. ImageIcon img = new ImageIcon(getClass().getResource( "/mioprogetto/images/img.png"));
  2.  JLabel l = new JLabel();
  3.  l.setIcon(img);


però nel caso tuo è il JTextPane che va a pescare l'immagine..
prova a mettere la cartella images dentro
mioprogetto->build->classes->mioprogetto->file.class
e nel tag img scrivi:
Codice sorgente - presumibilmente Plain Text

  1. <img src='/mioprogetto/images/img.png' alt='titolo immagine' />



spero che funzioni
altrimenti prova a mettere la cartella images dentro la directory del progetto
mioprgetto->images & src & ecc..
e nel tag
Codice sorgente - presumibilmente Plain Text

  1. <img src='images/img.png' alt='titolo immagine' />


cosi 99/100 funziona però non è professsionale

PM Quote
Avatar
killer (Normal User)
Expert


Messaggi: 217
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 15:59
Venerdì, 10/02/2012
non ci riesco...non funziona... forse ho capito male io. nulla da fare :( sto impazzendo..

PM Quote
Avatar
Bonny (Member)
Expert


Messaggi: 437
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 17:57
Venerdì, 10/02/2012
Ho fatto una piccola ricerca e ho trovato un esempio..
in pratica questo esempio prende un immagine inserisce il relativo tag <img> poi con i metodi della classe Graphics ci disegna sopra.... ho fatto una piccola modifica ovvero ho disegnato sopra l'immagine di partenza.
L'esempio lo ho trovato qui:
http://java-sl.com/tip_local_images.html
Comunque a mio parere sembra abbastanza macchinoso forse ci sara un metodo più semplice.
ti posto il codice modificato:
Codice sorgente - presumibilmente Java

  1. import javax.swing.*;
  2. import java.awt.*;
  3. import java.awt.image.BufferedImage;
  4. import java.net.MalformedURLException;
  5. import java.net.URL;
  6. import java.util.Dictionary;
  7. import java.util.Hashtable;
  8.  
  9. public class HTMLLocalImages {
  10.  
  11.     public static String localImageSrc = "http:\\a.png";
  12.     public static Image localImage = createImage();
  13.     public static String HTML = "<html>\n"
  14.             + "<body>\n"
  15.             + "Local image accessed from HTML<br>\n"
  16.             + "<img src=\"" + localImageSrc + "\">\n"
  17.             + "</body>\n"
  18.             + "</html>";
  19.     JTextPane edit = new JTextPane();
  20.  
  21.     public HTMLLocalImages() {
  22.         JFrame frame = new JFrame("Using local images example");
  23.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  24.         frame.getContentPane().add(edit);
  25.         edit.setContentType("text/html");
  26.         edit.setText(HTML);
  27.         try {
  28.             Dictionary cache = (Dictionary) edit.getDocument().getProperty("imageCache");
  29.             if (cache == null) {
  30.                 cache = new Hashtable();
  31.                 edit.getDocument().putProperty("imageCache", cache);
  32.             }
  33.  
  34.             URL u = new URL(localImageSrc);
  35.             cache.put(u, localImage);
  36.         } catch (MalformedURLException e) {
  37.             e.printStackTrace();
  38.         }
  39.  
  40.  
  41.         frame.setSize(500, 300);
  42.         frame.setLocationRelativeTo(null);
  43.         frame.setVisible(true);
  44.     }
  45.  
  46.     public static Image createImage() {
  47.        
  48.         ImageIcon MiaImg =new ImageIcon("a.png");
  49.        
  50.         BufferedImage img = new BufferedImage(MiaImg.getIconWidth(), MiaImg.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
  51.      
  52.         Graphics g = img.getGraphics();
  53.         ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  54.        /*
  55.         g.setColor(Color.BLUE);
  56.         g.fillRect(0, 0, 100, 50);
  57.  
  58.         g.setColor(Color.YELLOW);
  59.         g.fillOval(5, 5, 90, 40);
  60.         */
  61.         g.drawImage(MiaImg.getImage(), 0, 0, null);
  62.         img.flush();
  63.  
  64.         return img;
  65.     }
  66.  
  67.     public static void main(String[] args) throws Exception {
  68.         HTMLLocalImages htmlLocalImages = new HTMLLocalImages();
  69.     }
  70. }


ho inserito un'immagine nella directory del progetto a.png cosi a quanto pare funziona.
ti posto anche il progetto creato con NetBeans7.1


Bonny ha allegato un file: Test.zip (22882 bytes)
Clicca qui per scaricare il file
PM Quote
Avatar
killer (Normal User)
Expert


Messaggi: 217
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 8:38
Domenica, 12/02/2012
ti ringrazio molto.

PM Quote
Avatar
Bonny (Member)
Expert


Messaggi: 437
Iscritto: 24/04/2009

Segnala al moderatore
Postato alle 14:34
Domenica, 12/02/2012
Di niente :k:

Ultima modifica effettuata da Bonny il 12/02/2012 alle 14:35
PM Quote
Avatar
killer (Normal User)
Expert


Messaggi: 217
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 15:25
Domenica, 12/02/2012
cmq sikkome non mi ha risp nessuno nell altro topic che ho aperto, sapresti darmi na risposta te? perche quando uso DataOutputStream o DataInputStream la GUI non crasha ?
provo ad usare la ObjectInputStream ed ObjectOutputStream per scrivere tramite socket al server e si blocca tutta la gui.... sapresti darmi una spiegazione ?! grazie ancora

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo