Eine einfache Swing-Anwendung zeichnet zwei unabhängige JDialogs, die verschiedene JEditorPanes mit unterschiedlichem HTML-Inhalt enthalten. In einem JEditorPane verwenden wir CSS-Regeln, um die Grenzen der Tabelle sichtbar zu machen. Aber ein anderer JEditorPane verwendet dieselben CSS-Regeln und zeichnet auch einen 3px-Tabellenrahmen, aber das sollte nicht (wir setzen ihn nicht explizit). Warum benutzen sie die gleichen CSS-Regeln und wie können wir das beheben?Verschiedene JEditorPanes zeigen HTML-Inhalte, die die gleichen CSS-Regeln verwenden
public static void main(String args[]) {
String text1 = "<html><body><table><tr><td>somthing ONE</td></tr></table></body></html>";
String text2 = "<html><body><table><tr><td>somthing TWO</td></tr></table></body></html>";
JDialog jd = new JDialog();
JEditorPane jep = new JEditorPane();
HTMLEditorKit kit = new HTMLEditorKit();
HTMLDocument doc = (HTMLDocument) kit.createDefaultDocument();
jep.setEditorKit(kit);
jep.setDocument(doc);
setCSS(kit);
jep.setText(text1);
jd.getContentPane().add(jep);
jd.pack();
jd.setVisible(true);
JDialog jd2 = new JDialog();
JEditorPane jep2 = new JEditorPane();
HTMLEditorKit kit2 = new HTMLEditorKit();
HTMLDocument doc2 = (HTMLDocument) kit2.createDefaultDocument();
jep2.setEditorKit(kit2);
jep2.setDocument(doc2);
//We do not install css rules explicitly here
jep2.setText(text2);
jd2.getContentPane().add(jep2);
jd2.pack();
jd2.setVisible(true);
}
public static void setCSS(HTMLEditorKit kit) {
StyleSheet styleSheet = kit.getStyleSheet();
styleSheet.addRule("td {border-width: 3px; border-style: solid; border-color: #000000;}");
kit.setStyleSheet(styleSheet);
}
UPD: Wie Freek de Bruijn sagte, es ist kein Fehler und es ist dokumentiert. Wenn wir StyleSheet in HTMLEditorKit setzen oder abrufen, verwendet es StyleSheet von AppContext und teilt daher StyleSheet zwischen allen Instanzen von HTMLEditorKit. Daher besteht die einzige Möglichkeit, dieses Problem zu lösen, darin, die Methoden von HTMLEditorKit zu überschreiben. Ich habe es auf diese Weise:
public static class CustomKit extends HTMLEditorKit {
private StyleSheet styles;
@Override
public void setStyleSheet(StyleSheet styleSheet) {
styles = styleSheet;
}
@Override
public StyleSheet getStyleSheet() {
if (styles == null) {
styles = super.getStyleSheet();
}
return styles;
}
}
Und setCSS Methode sieht nun wie:
public static void setCSS(CustomKit kit) {
StyleSheet styleSheet = new StyleSheet();
styleSheet.addRule("td {border-width: 3px; border-style: solid; border-color: #000000;}");
kit.setStyleSheet(styleSheet);
}
Vielen Dank !. Ich habe gerade die erste Zeile der setCSS-Methode zu "StyleSheet styleSheet = new StyleSheet();" geändert. Es funktioniert nicht richtig. Vielen Dank! – shiv
Schön, dass die Lösung so einfach ist! –
Ich war zu schnell um zu sagen, dass es alles gestern löst. Heute, als ich versuchte, die Lösung in echte App zu verschieben, merke ich es - jetzt funktioniert es entgegengesetzt, dass es sollte, also der erste Dialog ist ohne Grenzen (aber es sollte) und zweitens ist mit Grenzen (aber es sollte nicht). Wie auch immer, dank dir habe ich einen Weg zur Lösung des Problems gefunden und nachdem ich ein wenig untersucht habe, habe ich es geschafft, es zu lösen. Ich habe meinen Beitrag aktualisiert, um meine Lösung zu zeigen. – shiv