2013-02-27 10 views
6

Quando si impostaContentType ("text/html") viene applicato solo per il testo impostato tramite JTextPane.setText(). Tutto il resto del testo, che viene messo in JTextPane tramite gli stili, è "immune" al tipo di contenuto.setContentType ("text/html") per JTextPane non funziona come previsto

Ecco cosa voglio dire:

private final String[] messages = {"first msg", "second msg <img src=\"file:src/test/2.png\"/> yeah", "<img src=\"file:src/test/2.png\"/> third msg"}; 

public TestGUI() throws BadLocationException { 
    JTextPane textPane = new JTextPane(); 
    textPane.setEditable(false); 
    textPane.setContentType("text/html"); 

    //Read all the messages 
    StringBuilder text = new StringBuilder(); 
    for (String msg : messages) { 
     textext.append(msg).append("<br/>"); 
    } 
    textPane.setText(text.toString()); 

    //Add new message 
    StyledDocument styleDoc = textPane.getStyledDocument(); 
    styleDoc.insertString(styleDoc.getLength(), messages[1], null); 

    JScrollPane scrollPane = new JScrollPane(textPane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 

    //add scrollPane to the main window and launch 
    //... 
} 

In generale, ho una chat che è rappresentato da JTextPane. Ricevo messaggi dal server, li elaboro - imposta il colore del testo per casi specifici, cambia i segni del sorriso sul percorso delle immagini ecc. Tutto è fatto entro i limiti dell'HTML. Ma come si può vedere chiaramente dall'esempio sopra, solo il setText è l'oggetto di setContentType ("text/html") e la seconda parte, dove il nuovo messaggio aggiunto è rappresentato da "text/plain" (se non sbaglio).

È possibile applicare il tipo di contenuto "text/html" a tutti i dati che vengono inseriti in JTextPane? Senza di esso, è quasi impossibile elaborare i messaggi senza l'implementazione di un algoritmo molto complesso.

risposta

9

Non credo che si dovrebbe utilizzare il metodo insertString() per aggiungere il testo. Penso che si dovrebbe usare qualcosa di simile:

JTextPane textPane = new JTextPane(); 
textPane.setContentType("text/html"); 
textPane.setEditable(false); 
HTMLDocument doc = (HTMLDocument)textPane.getDocument(); 
HTMLEditorKit editorKit = (HTMLEditorKit)textPane.getEditorKit(); 
String text = "<a href=\"abc\">hyperlink</a>"; 
editorKit.insertHTML(doc, doc.getLength(), text, 0, 0, null); 
+0

Sento davvero di essere uno sviluppatore inefficiente (nonostante sia nuovo di swing e programmazione GUI). A volte penso che Java Swing manchi di molte buone caratteristiche e si dovrebbe implementarle da sé, ma la mia esperienza non mi permette di farlo e mi sconvolge molto. La tua variante è persino più grande di quella di Joop Eggen - è più flessibile, se così si può dire. – Dragon

+0

Una risposta più completa dovrebbe ricevere Accept. –

+0

@JoopEggen, (Offtopic) Sono un po 'diversi, ma entrambi sono buoni. Ho bisogno di controllarli nel contesto completo - è quello che faccio ora :) – Dragon

3

rieditare

Scusa, ho frainteso il problema: l'inserimento di una stringa come HTML. Per questo si ha la necessità di ricorrere alle capacità HTMLEditorKit:

  StyledDocument styleDoc = textPane.getStyledDocument(); 
      HTMLDocument doc = (HTMLDocument)styleDoc; 
      Element last = doc.getParagraphElement(doc.getLength()); 
      try { 
       doc.insertBeforeEnd(last, messages[1] + "<br>"); 
      } catch (BadLocationException ex) { 
      } catch (IOException ex) { 
      } 
+0

Grazie, non credo che possa essere così facile. – Dragon

1

Ecco un modo molto più semplice per farlo.

JTextPane pane = new JTextPane(); 
pane.setContentType("text/html"); 

pane.setText("<html><h1>My First Heading</h1><p>My first paragraph.</p></body></html>"); 
+0

Questo non si applica se si utilizza la funzione pane.getDocument(). InsertString (...) per aggiungere testo al JTextPane –

+0

Questo era quello che voglio. Grazie –

Problemi correlati