2013-04-07 11 views
5

Ich verwende eine ungeordnete HTML-Liste, um Text in einem JEditorPane anzuzeigen. Eine Probe des HTML sieht wie folgt aus:Ungeordnete Liste Bullet Looks Pixeled in JEditorPane

<ul><li>Cautious</li> 
<li>Curious</li> 
</ul> 

Das funktioniert alles gut und schön, aber seltsamerweise die von <li> erzeugten Kugeln sehen nicht die gleiche Qualität wie der Text zu sein, es ist neben. (Mac OS 10.7.5 wird ausgeführt, wenn es darauf ankommt). Die runden Kugeln aussehen blocky und pixelig:

Normale Zoom:

enter image description here

Gezoomte in:

enter image description here

Wie besonders deutlich, wenn es in gezoomt wird, dies ist nur ein Block von Pixeln, die nicht symmetrisch sind und keine Form von Anti-Aliasing haben, was für einen weniger als überzeugend kreisförmigen Rundungspunkt sorgt. Im Vergleich zum Text daneben sieht es selbst bei normalem Zoom "scharf" aus.

Gibt es eine Möglichkeit, dass ich das beheben kann?

EDIT: Mit dem • Zeichen (Option + auf einem Mac) erzeugt einen kleinen Aufzählungspunkt in dem Text, der nicht pixelig aussieht. Ich könnte natürlich dieses Zeichen manuell einfügen, anstatt <ul><li> zu verwenden, aber ich möchte eine HTML ungeordnete Liste verwenden, wenn ich kann.

Antwort

4

Verwenden Hinweise Rendering einzuschalten Anti-Aliasing-Eigenschaft KEY_ANTIALIASING.

Sie setzen einige Rendering Hinweise globally, aber das scheint nicht für KEY_ANTIALIASING zu arbeiten, so müssen Sie die paint() Methode von JEditorPane außer Kraft zu setzen.

public class HTMLTest {  

     public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
      String html = "<ul><li>Cautious</li><li>Curious</li></ul>"; 
      JEditorPane pane = new JEditorPane("text/html", html) { 

       public void paint(Graphics g) { 
       Graphics2D g2d = (Graphics2D) g.create(); 
       g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
       super.paint(g2d); 
       g2d.dispose(); 
       } 

      }; 
      pane.setVisible(true); 

      JOptionPane.showMessageDialog(null, pane); 
      } 
     });  
     } 
} 
+0

Funktioniert perfekt! Leider enthält die Verknüpfung, auf die Sie zum Rendern von Hinweisen global verwiesen haben, eine Notiz, die besagt, dass sie nicht für Schlüssel-Anti-Aliasing (nur Text) geeignet ist. Trotzdem funktioniert das ohne Probleme. Genieße das Kopfgeld! – Thunderforge

+0

Danke. Ich habe meine Antwort bearbeitet, um Ihren Kommentar zu übernehmen. – Enwired

2

Sie müssen die Aufzählungszeichen ändern. Erstellen Sie ein Bild mit einem besser aussehenden Aufzählungszeichen, und fügen Sie dann CSS zum Editorfenster hinzu, damit es Ihr neues Aufzählungsbild verwendet.

JEditorPane pane = new JEditorPane(); 
String u = "C:/path/to/bullet.png"; 
HTMLEditorKit htmlEditorKit = (HTMLEditorKit) pane.getEditorKit(); 
StyleSheet styleSheet = htmlEditorKit.getStyleSheet(); 
styleSheet.addRule(String.format("ul{list-style-image:url(%s);margin:0px 20px;", u)); 
+0

Ich kann das Bild nicht laden. 'new File (u) .exists()' gibt true zurück, aber ich sehe nur den Standard-Aufzählungspunkt, auch wenn ich ein komplett anderes Bild versuche. Außerdem würde ich eine Methode bevorzugen, bei der ich kein internes Bild verwenden musste. Könnte ich stattdessen das "•" (U + 2022) verwenden? – Thunderforge

+0

Ich habe derzeit eine Bearbeitung im Überblick, die den Code behebt. Ich fand heraus, dass der Grund, warum es für mich nicht funktionierte, war, dass du mit "file: ///" anfangen musst, weil es eine URL ist. Außerdem habe ich herausgefunden, dass der Code überhaupt nicht funktioniert, wenn ein bestimmter JEditorPane-Konstruktor verwendet wird. Die Lösung funktioniert jetzt, aber ich mag die andere Lösung besser, weil sie das Pixelierungsproblem löst, ohne auf ein externes Bild angewiesen zu sein. – Thunderforge