# JTextPane HTML und eigene Tags



## Capasso (17. Feb 2009)

Hallo,

ich bin gerade dabei ein JTextPane zu schreiben das HTML anzeigen kann welches durch Buttons angepasst werden kann.  

(siehe auch: Suche fertigen HTML editor - java-forum.org)

Das mit den HTML Tags funktioniert auch soweit. Jetzt möchte ich aber zusätzlich eigene tag verwenden.

Bis jetzt bin ich aber noch nicht fündig geworden wie ich dem JTextPane (Mit HTMLEditorKit und HTMLDocument) beibringe das es bei  <wrongWord>fehler</wrongWord>  das wort fehler rot darstellt und <wrongWord> weglässt

Gruß
Capasso


----------



## Capasso (10. Mrz 2009)

Niemand eine Idee?


----------



## Ebenius (10. Mrz 2009)

Das HTMLEditorKit kennt HTML. Das Tag "wrongWord" gehört nicht zu HTML. Du könntest Dir ein eigenes (von mir aus von HTMLEditorKit abgeleitetes) Editor Kit schreiben. Aber das möchtest Du nicht.

Warum benutzt Du nicht die Möglichkeiten die Dir HTML ohnehin schon bietet. 
Benutze das span-Tag (span inline oder das div-Tag für ganze Bereiche) mit style-Attribut: 
	
	
	
	





```
Das ist mein Text <span style="color:red">mit einem Fehler</span> drin
```

Benutze das span/div-Tag mit class-Attribut: 
	
	
	
	





```
Das ist mein Text <span class="error">mit einem Fehler</span> drin
```
 ... und definiere die Klasse "error" im StyleSheet: 
	
	
	
	





```
*.error { color:red }
```

Ebenius


----------



## Capasso (10. Mrz 2009)

ja könnte ich machen.

Eine Frage hätte ich aber noch. wie bekomme ich es hin das ich eine Action habe, die je nachdem ob span vorhanden ist dieses setzt oder entfernt.

Also aus

```
<span class="error">falsch</span>
```
 
falsch

macht und aus

falsch


```
<span class="error">falsch</span>
```


----------



## Ebenius (10. Mrz 2009)

Bahnhof?

Beschreib das doch nochmal anders.

Ebenius


----------



## Capasso (10. Mrz 2009)

ok,

sagen wir ich hab folgendes Dokument

```
<html>
...
<body>
 <b> Das ist ein fetter <span class="error">falsch</span> text </b>
</body>
```
 
Jetzt möchte ich einen Button haben, der folgendes macht.

Ich habe das Wort "falsch" per Maus markiert. Jetzt drücke ich den Button. Dann verschwindet <span class="error"> und das Document sieht so aus:

```
<html>
...
<body>
 <b> Das ist ein fetter falsch text </b>
</body>
```
 
Wenn ich falsch weiterhin markiert habe und den Button nochmal drücke soll span wieder erscheinen, also

```
<html>
...
<body>
 <b> Das ist ein fetter <span class="error">falsch</span> text </b>
</body>
```
 
Wichtig wäre das andere tags davon unberührt bleiben.

Also aus 

```
<b><span class="error"><u>falsch</u></span></b>
```
 
wird 

```
<b>u>falsch</u></b>
```


----------



## Ebenius (10. Mrz 2009)

Capasso hat gesagt.:


> Wichtig wäre das andere tags davon unberührt bleiben.
> 
> Also aus
> 
> ...


Dazu hab ich doch erstmal eine Frage: Was passiert, wenn dieser Text so markiert werden würde: 
	
	
	
	





```
Dies ist <b>ein falsch</b> Text
                ^^^^^^^^^^^^^^^
```
... und jemand den Button drückt?

Ebenius


----------



## Capasso (10. Mrz 2009)

das überleg ich mir wenn es soweit ist 

das ist momentan noch nicht relevant.
Nachher werden nur komplette wörter markiert und automatisch verändert. Dann verschwindet der Button.


----------



## Ebenius (10. Mrz 2009)

Hmpf. Ich hab's auf die Schnelle nicht sauber hinbekommen. Wenn ich's nicht vergesse, dann beschäftige ich mich am Abend nochmal damit.

Ebenius


----------



## Capasso (10. Mrz 2009)

das wäre super.

momentan verwende ich das Tag <strike> um die Wörter zu markieren.
Damit geht es recht simpel, weil alle Methoden usw. schon vorhanden sind.

[highlight=Java]
class StrikeThroughAction extends StyledEditorKit.StyledTextAction{

 boolean wrong = true;

 public StrikeThroughAction(){
  super(StyleConstants.StrikeThrough.toString());
 }

 public void setWrong(boolean b) {
  wrong = b;
 }

 public void actionPerformed(ActionEvent ae){
  JEditorPane editor = getEditor(ae);
  if (editor != null) {
   StyledEditorKit kit = getStyledEditorKit(editor);
   MutableAttributeSet attr = kit.getInputAttributes();
   boolean strikeThrough = (StyleConstants.isStrikeThrough(attr)) ? false : true;
   //System.out.println(strikeThrough+" "+wrong);
   if (strikeThrough && wrong)  {
    SimpleAttributeSet sas = new SimpleAttributeSet();
    StyleConstants.setStrikeThrough(sas, true);
    setCharacterAttributes(editor, sas, false);
   } else if (!wrong){
    SimpleAttributeSet sas = new SimpleAttributeSet();
    StyleConstants.setStrikeThrough(sas, false);
    setCharacterAttributes(editor, sas, false);
   }

  }   
 }
}[/highlight]


----------



## Capasso (12. Mrz 2009)

?? Wo ist eigentlich der Quellcode hin der in meinem letzten Beitrag war ??

Egal.

Ich denke ich werde doch einen eigenen Tag definieren müssen.
Aber mir ist bisher nicht klar welche Klassen ich wie überschreiben muss

Klar ist das ich ne geerbte Klasse vom javax.swing.text.html.HTML brauche, also
[highlight=Java]
public class DWHtml extends HTML{

 public static class DWTag extends Tag{
  protected DWTag(String id) {
      super(id, false, false);
  }
 };

 public static final DWTag WRONG = new DWTag("wrong");


}
[/highlight]

und eine geerbte Klasse von javax.swing.text.html.HTMLEditorKit in der widerum ne geerbte Version von der HTMLFactory steckt.
[highlight=Java]
public static class HTMLFactoryExtended extends HTMLFactory implements ViewFactory{

  public HTMLFactoryExtended()
  {
  }
    public View create(Element elem)
  {
   Object obj = elem.getAttributes().getAttribute(StyleConstants.NameAttribute);
   if(obj instanceof HTML.Tag) {
    HTML.Tag tagType = (HTML.Tag)obj;
    //System.out.println("tagtype: "+tagType);
    if (tagType.toString().equalsIgnoreCase(DWHtml.WRONG.toString())) {
     return new WrongWordView(elem);
    }

   }
   return super.create(elem);
  }
}
[/highlight]

Die Klasse funktioniert aber schon nicht ganz sauber, weil ich auf Stringgleichheit vergleichen muss (tagType.toString().equalsIgnoreCase(DWHtml.WRONG.toString()) ).

Dann hab ich ausprobiert ne View zu schreiben. Damit hab ich es hinbekomen das dar Tag nicht angezeigt wird sondern ein roter hintergrund an der Stelle wo dar tag war. Aber das Wort zwischen dem Tag war davon unberührt.

Da hänge ich momentan fest.


----------

