JTextPane HTML und eigene Tags

Status
Nicht offen für weitere Antworten.

Capasso

Bekanntes Mitglied
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
 
Zuletzt bearbeitet von einem Moderator:
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.
  1. Benutze das span-Tag (span inline oder das div-Tag für ganze Bereiche) mit style-Attribut:
    HTML:
    Das ist mein Text <span style="color:red">mit einem Fehler</span> drin
  2. Benutze das span/div-Tag mit class-Attribut:
    HTML:
    Das ist mein Text <span class="error">mit einem Fehler</span> drin
    ... und definiere die Klasse "error" im StyleSheet:
    Code:
    *.error { color:red }
Ebenius
 
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
HTML:
<span class="error">falsch</span>

falsch

macht und aus

falsch

HTML:
<span class="error">falsch</span>
 
ok,

sagen wir ich hab folgendes Dokument
HTML:
<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:
<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:
<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
HTML:
 <b><span class="error"><u>falsch</u></span></b>

wird
HTML:
 <b>u>falsch</u></b>
 
Wichtig wäre das andere tags davon unberührt bleiben.

Also aus
HTML:
 <b><span class="error"><u>falsch</u></span></b>

wird
HTML:
 <b>u>falsch</u></b>
Dazu hab ich doch erstmal eine Frage: Was passiert, wenn dieser Text so markiert werden würde:
Code:
Dies ist <b>ein falsch</b> Text
                ^^^^^^^^^^^^^^^
... und jemand den Button drückt?

Ebenius
 
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.
 
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
 
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]
 
Zuletzt bearbeitet von einem Moderator:
?? 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.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben