2015-11-18 2 views
5

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); 
} 

Antwort

1

Es scheint, dass das StyleSheet Objekt von allen HTMLEditorKit Instanzen gemeinsam genutzt wird. Aus dem Javadoc Kommentar der HTMLEditorKit.getStyleSheet Methode:

* Get the set of styles currently being used to render the 
* HTML elements. By default the resource specified by 
* DEFAULT_CSS gets loaded, and is shared by all HTMLEditorKit 
* instances. 
+0

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

+0

Schön, dass die Lösung so einfach ist! –

+0

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

Verwandte Themen