
killer (Normal User)
Expert
    
Messaggi: 217
Iscritto: 19/07/2009
|
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 |
public void insertIntoTextPane (String htmltext ) { getTextPane().setContentType("text/html"); try { getTextPane().setEditorKit(kit); getTextPane().setDocument(doc); kit.insertHTML(doc, doc.getLength(),htmltext,0, 0, null); } }
|
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)
|
|

Bonny (Member)
Expert
    
Messaggi: 437
Iscritto: 24/04/2009
|
Secondo me basta usare un JTextPane e settare la proprietà setEditorKit per l'html per esempio:
Codice sorgente - presumibilmente Java |
class Finestra extends JFrame{ private JTextPanel txtarea; public Finestra(){ this.getContentPane().add(txtarea); } }
|
quindi quando inserisci delle stringhe sulla txtarea, interpreta anche il codice Html
esempio
Codice sorgente - presumibilmente Java |
String html = "<b>ciao mondo</b>"; 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 |
|

killer (Normal User)
Expert
    
Messaggi: 217
Iscritto: 19/07/2009
|
uhm ho provato non funziona. cmq ci sono riuscito ho trovato la soluzione e la posto:
Codice sorgente - presumibilmente Java |
Document doc = getEditorPane (). getDocument(); if (doc != null) { EditorKit ek = getEditorPane (). getEditorKit(); try { } } else { try { doc.insertString(doc.getEndPosition().getOffset() - 1, data + "\n", null); } } }
|
Però mi sorge una domanda... se io volessi visualizzare nell' EditorPane un'immagine come devo fare ? ho provato con :
Codice sorgente - presumibilmente Plain Text |
<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 |
|

Bonny (Member)
Expert
    
Messaggi: 437
Iscritto: 24/04/2009
|
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 |
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 |
<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 |
<img src='images/img.png' alt='titolo immagine' />
|
cosi 99/100 funziona però non è professsionale |
|

killer (Normal User)
Expert
    
Messaggi: 217
Iscritto: 19/07/2009
|
non ci riesco...non funziona... forse ho capito male io. nulla da fare sto impazzendo..
|
|

Bonny (Member)
Expert
    
Messaggi: 437
Iscritto: 24/04/2009
|
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 |
import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; import java.net.MalformedURLException; import java.net.URL; import java.util.Dictionary; import java.util.Hashtable; public class HTMLLocalImages { public static String localImageSrc = "http:\\a.png"; public static Image localImage = createImage (); + "<body>\n" + "Local image accessed from HTML<br>\n" + "<img src=\"" + localImageSrc + "\">\n" + "</body>\n" + "</html>"; public HTMLLocalImages() { frame. setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE); frame.getContentPane().add(edit); edit.setContentType("text/html"); try { if (cache == null) { edit.getDocument().putProperty("imageCache", cache); } URL u = new URL(localImageSrc ); cache.put(u, localImage); e.printStackTrace(); } frame.setSize(500, 300); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static Image createImage () { /* g.setColor(Color.BLUE); g.fillRect(0, 0, 100, 50); g.setColor(Color.YELLOW); g.fillOval(5, 5, 90, 40); */ g.drawImage(MiaImg.getImage(), 0, 0, null); img.flush(); return img; } HTMLLocalImages htmlLocalImages = new HTMLLocalImages(); } }
|
ho inserito un'immagine nella directory del progetto a.png cosi a quanto pare funziona.
ti posto anche il progetto creato con NetBeans7.1
|
|

killer (Normal User)
Expert
    
Messaggi: 217
Iscritto: 19/07/2009
|
ti ringrazio molto.
|
|

Bonny (Member)
Expert
    
Messaggi: 437
Iscritto: 24/04/2009
|
Di niente
Ultima modifica effettuata da Bonny il 12/02/2012 alle 14:35 |
|

killer (Normal User)
Expert
    
Messaggi: 217
Iscritto: 19/07/2009
|
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
|
|