Oppure

Loading
08/02/12 15:31
killer
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
public void insertIntoTextPane(String htmltext) {
       getTextPane().setContentType("text/html");
        try {
            HTMLEditorKit kit = new HTMLEditorKit();
            getTextPane().setEditorKit(kit);
            HTMLDocument doc = new HTMLDocument();
            getTextPane().setDocument(doc);
            kit.insertHTML(doc, doc.getLength(),htmltext,0, 0, null);
        } catch (BadLocationException | IOException e) {
        }
}


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.access0(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.accessSalve 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
public void insertIntoTextPane(String htmltext) {
       getTextPane().setContentType("text/html");
        try {
            HTMLEditorKit kit = new HTMLEditorKit();
            getTextPane().setEditorKit(kit);
            HTMLDocument doc = new HTMLDocument();
            getTextPane().setDocument(doc);
            kit.insertHTML(doc, doc.getLength(),htmltext,0, 0, null);
        } catch (BadLocationException | IOException e) {
        }
}


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.access0(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{parsed_message}0(EventQueue.java:101)
    at java.awt.EventQueue.run(EventQueue.java:666)
    at java.awt.EventQueue.run(EventQueue.java:664)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain.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)
0(EventQueue.java:101)
    at java.awt.EventQueue.run(EventQueue.java:666)
    at java.awt.EventQueue.run(EventQueue.java:664)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain.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)
aaa
08/02/12 20:21
Bonny
Secondo me basta usare un JTextPane e settare la proprietà setEditorKit per l'html per esempio:
class Finestra extends JFrame{

     private JTextPanel txtarea;
     public Finestra(){
              txtarea = new JTextArea();
              txtarea.setEditorKit(new HTMLEditorKit());
              this.getContentPane().add(txtarea);
     }
    
}

quindi quando inserisci delle stringhe sulla txtarea, interpreta anche il codice Html
esempio
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 08/02/12 20:22
aaa
09/02/12 10:06
killer
uhm ho provato non funziona. cmq ci sono riuscito ho trovato la soluzione e la posto:
 Document doc = getEditorPane().getDocument();
        if (doc != null) {
            EditorKit ek = getEditorPane().getEditorKit();
            if (ek instanceof HTMLEditorKit && doc instanceof HTMLDocument) {
                try {
                    ((HTMLEditorKit) ek).insertHTML((HTMLDocument) doc, doc.getEndPosition().getOffset() - 1, data, 1, 0, null);
                } catch (BadLocationException | IOException ex) {
                }
            } else {
                try {
                    doc.insertString(doc.getEndPosition().getOffset() - 1, data + "\n", null);
                } catch (BadLocationException ex) {
                }
            }
        }


Però mi sorge una domanda... se io volessi visualizzare nell' EditorPane un'immagine come devo fare ? ho provato con :
<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 09/02/12 10:09
aaa
09/02/12 12:09
Bonny
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:
 ImageIcon img = new ImageIcon(getClass().getResource( "/mioprogetto/images/img.png"));
 JLabel l = new JLabel();
 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:
<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
<img src='images/img.png' alt='titolo immagine' />

cosi 99/100 funziona però non è professsionale
aaa
10/02/12 14:59
killer
non ci riesco...non funziona... forse ho capito male io. nulla da fare :( sto impazzendo..
aaa
10/02/12 16:57
Bonny
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:
java-sl.com/…
Comunque a mio parere sembra abbastanza macchinoso forse ci sara un metodo più semplice.
ti posto il codice modificato:
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();
    public static String HTML = "<html>\n"
            + "<body>\n"
            + "Local image accessed from HTML<br>\n"
            + "<img src=\"" + localImageSrc + "\">\n"
            + "</body>\n"
            + "</html>";
    JTextPane edit = new JTextPane();

    public HTMLLocalImages() {
        JFrame frame = new JFrame("Using local images example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(edit);
        edit.setContentType("text/html");
        edit.setText(HTML);
        try {
            Dictionary cache = (Dictionary) edit.getDocument().getProperty("imageCache");
            if (cache == null) {
                cache = new Hashtable();
                edit.getDocument().putProperty("imageCache", cache);
            }

            URL u = new URL(localImageSrc);
            cache.put(u, localImage);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }


        frame.setSize(500, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static Image createImage() {
        
        ImageIcon MiaImg =new ImageIcon("a.png");
        
        BufferedImage img = new BufferedImage(MiaImg.getIconWidth(), MiaImg.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
      
        Graphics g = img.getGraphics();
        ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
       /*
        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;
    }

    public static void main(String[] args) throws Exception {
        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
aaa
12/02/12 7:38
killer
ti ringrazio molto.
aaa
12/02/12 13:34
Bonny
Di niente :k:
Ultima modifica effettuata da Bonny 12/02/12 13:35
aaa