# html in jTextPane klappt teilweise und teilweise nicht



## SBehnen27 (28. Jul 2005)

so. hab schon haufenweise threads durchsucht nach ergebnissen, die mich weiter bringen.
leider ohne erfolg.

ich habe für einen mini-chat ein jtextpane in einem scrollpane. Hier mal die "besonderen Sachen":


```
eingang.setContentType("text/html"); 
eingang.setText("<html><body><font color='#CC0033'>"+Selber.getName()+" ist voll dabei!</font>");
```

der text, der dort gesetzt wird erscheint auch rot in der ersten zeile. So weit so gut.

wenn ich nun meinen senden button drücke wird folgendes ausgeführt:


```
public void senden(String nachricht){
        try{
            //ObjectOut.writeObject("<html><font color='#CC0033'>"+Selber.getName()+"</font>"+": "+nachricht+"</html>");
            ObjectOut.writeObject("<font color='#CC0033'>"+Selber.getName()+"</font>"+": "+nachricht);
            ObjectOut.flush();
            //ObjectOut.reset();
            //eingang.setText(eingang.getText()+"\n"+"<html><font color='#1cab0d'>"+Selber.getName()+"</font>"+": "+nachricht+"</html>");
            eingang.setText(eingang.getText()+"
<font color='#1cab0d'>"+Selber.getName()+"</font>"+": "+nachricht);
            ausgang.setText("");
        }
        catch(Exception e){}
    }
```

das eigenartige ist nun, dass davon nichts zu sehen ist... es kommen nichtmal leere zeilen dazu ...
hab auch mal gedacht, das liegt dran, weil ich HTML nicht schliesse. habs dann ausprobiert, hat aber auch nichts gebracht...
Jemand ne Idee, woran das liegen könnte?

dazu ist noch zu sagen, wenn ich den ContentType auf text/plain setze wird alles angezeigt (aber dann halt mit den <TAGs>...


----------



## Roar (28. Jul 2005)

1. uf, html. verwende doch lieber attribuetsets, mit denen kannst du 1. bestimmt speicher sparen & 2. ist die möglichkeit gegeben einfach den style zu ändern
2. uf, objectoutputstreams für netzwerk? is das nich bisschen zu langsam? und
3. warum schickst du die formatierung mit? ist doch nur ballast

so nachdem das geklärt wär  :
schonmal dir den stack6trace der exception ausgeben lassen? sone exception einfach unbehandelt lassen is böse 

btw 4.: insertString() ist bestimmt nochmal n paar ms schneller als setText(getText()) 

edit: uff, hättste das nich vorher sagen können?  naja gib trotzdem mal die xception aus, falls eine fliegen sollte...


----------



## SBehnen27 (28. Jul 2005)

getestet und: keine exception.

wird einfach nicht angezeigt... wie funzt das denn mit den attribut sets? vll. probier ich das ja mal aus.

zu den anderen geschichten: dieser "chat" is nur nen popeliges teil, das als zusatz bei einem Spiel dabei is.
da kommts nicht drauf an ob das schnell is oder nich... nur farbig solls sein


----------



## Sky (28. Jul 2005)

Suchfunktion!

z.B. http://www.java-forum.org/de/viewtopic.php?t=20697&highlight=jtextpane+attributeset


----------



## SBehnen27 (28. Jul 2005)

ich beziehe mich auf folgendes beispiel:

```
JTextPane pane = new JTextPane(); 
        pane.setContentType("text/html"); 
        pane.setText( 
                "<font color = blue>Hallo</font> <a href>dies ist ein Test</a><font color=yellow>Dieses 
Element sollte seine Farbe durch HTML bekommen haben</font>"); 
        add(pane); 
        SimpleAttributeSet attributeSet = new SimpleAttributeSet(); 
        SimpleAttributeSet attributeSet2 = new SimpleAttributeSet(); 
        SimpleAttributeSet attributeSet3 = new SimpleAttributeSet();        
        StyleConstants.setForeground(attributeSet, Color.RED); 
        StyleConstants.setForeground(attributeSet2, Color.GREEN); 
        StyleConstants.setForeground(attributeSet3, Color.CYAN); 
        StyleConstants.setBold(attributeSet, true); 
        StyleConstants.setItalic(attributeSet, true); 
        StyleConstants.setFontSize(attributeSet, 20); 
        StyledDocument doc = pane.getStyledDocument(); 
        doc.setCharacterAttributes(0, 5, attributeSet, false); 
        doc.setCharacterAttributes(7, doc.getLength()-7, attributeSet2, false); 
        doc.setCharacterAttributes(5, 2, attributeSet3
```

wenn ich das richtig sehe, dann is das ne recht statische geschichte... ich hab damit zwar noch nie was gemacht, aber es sieht mir doch recht ungeeignet aus für das, was ich vor habe... da scheint mir html doch wesentlich einfacher zu sein.

und die erste zeile wird ja auch dargestellt. nur halt die weiteren angefügrten nicht...


----------



## Sky (28. Jul 2005)

Machs halt so: 
	
	
	
	





```
public class Test extends JFrame {

  SimpleAttributeSet as = new SimpleAttributeSet();

  public Test() {
    JTextPane pane = new JTextPane();
    pane.setEnabled(false);

    pane.setContentType( "text/html" );
    getContentPane().add( pane );

    addMessage( pane, "Rot/Gelb-Fett-20", Color.RED, Color.YELLOW, true, false, 20 );
    addMessage( pane, "Blau/Gruen-16", Color.BLUE, Color.GREEN, false, false, 16 );
    addMessage( pane, "\n neue Zeile\n", Color.BLACK, Color.WHITE, false, true, 16 );
    addMessage( pane, " Noch ne Nachricht\n", Color.DARK_GRAY, Color.ORANGE, false, false, 12 );
    addMessage( pane, " letzter Test", Color.BLUE, Color.WHITE, true, false, 10 );
  }

  private boolean addMessage( JTextPane pane, String text, Color fg, Color bg, boolean bold, boolean italic, int fontsize ) {
    StyleConstants.setForeground( as, fg );
    StyleConstants.setBackground( as, bg );
    StyleConstants.setBold( as, bold );
    StyleConstants.setItalic( as, italic );
    StyleConstants.setFontSize( as, fontsize );
    StyledDocument doc = pane.getStyledDocument();
    try {
      doc.insertString( doc.getLength(), text, as );
    } catch( BadLocationException ex ) {
      return false;
    }
    return true;
  }

  public static void main( String[] args ) throws Exception {
    Test x = new Test();
    x.pack();
    x.setVisible( true );
    x.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
  }
}
```


----------



## sisko78 (28. Jul 2005)

oder z.b. mit Styles:

```
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;


class JTextPane2
    extends JTextPane {
  boolean wrap = true;
  StyledDocument doc;


  public JTextPane2() {
    doc = this.getStyledDocument();
    this.addStylesToDocument(doc);
  }

  public JTextPane2(boolean wrap) {
    this.wrap = wrap;
  }

  public JTextPane2(StyledDocument doc) {
    super(doc);
  }

  public boolean getScrollableTracksViewportWidth() {
    if (wrap) {
      return super.getScrollableTracksViewportWidth();
    }
    else {
      return false;
    }
  }

  public void setSize(Dimension d) {
    if (!wrap) {
      if (d.width < getParent().getSize().width) {
        d.width = getParent().getSize().width;
      }
    }
    super.setSize(d);
  }

  //Sets the line-wrapping policy of the JTextPane2
  //By default this property is true
  void setLineWrap(boolean wrap) {
    setVisible(false);
    this.wrap = wrap;
    setVisible(true);
  }

  /**
   * Add some styles to the document:
   * regular,italic,blue,bold,small,large
   *
   * @param doc StyledDocument
   */
  protected void addStylesToDocument(StyledDocument doc) {
    //Initialize some styles.
    Style def = StyleContext.getDefaultStyleContext().
        getStyle(StyleContext.DEFAULT_STYLE);

    Style regular = doc.addStyle("regular", def);
    StyleConstants.setFontFamily(def, "SansSerif");

    Style s = doc.addStyle("italic", regular);
    StyleConstants.setItalic(s, true);

    s = doc.addStyle("blue", regular);
    StyleConstants.setForeground(s, Color.BLUE);

    s = doc.addStyle("bold", regular);
    StyleConstants.setBold(s, true);

    s = doc.addStyle("small", regular);
    StyleConstants.setFontSize(s, 10);

    s = doc.addStyle("large", regular);
    StyleConstants.setFontSize(s, 16);
  }

  /**
   * Append text to TextPane with a specific Style. Possible styles:
   * regular, italic, blue, bold, small, large
   *
   * @param text String
   * @param style String
   */
  protected void appendText(String text, String style) {
    try {
      doc.insertString(doc.getLength(), text, doc.getStyle(style));
    }
    catch (BadLocationException ex) {
      System.out.println(
          "A BadLocationException occured when appending a String to the JTextPane");
    }
  }
}
```


----------

