2013-03-19 3 views
5

Ich habe eine Desktop-Java-Anwendung, an der ich arbeite und habe JDK 6 für die Entwicklung über IDE verwendet. Ich verwende den Rendering-Hinweis VALUE_FRACTIONALMETRICS_ON zusammen mit anderen Hinweisen, um Text in JLabels besser zu rendern. Diese Hinweise funktionieren wunderbar auf JVM 1.6, aber ich habe kürzlich bemerkt, dass es die VALUE_FRACTIONALMETRICS_ON vollständig ignoriert, wenn ich die App mit einem JRE 1.7 ausführe. Gibt es etwas, das ich hier falsch mache, das Java 7 diese Hinweise ignoriert?Rendern von Text mit FRACTIONALMETRICS in Java 7

lblDate = new ATimeLabel(ATimeLabel.DATE_LETTERS) { 
    private static final long serialVersionUID = 1L; 

    @Override 
    protected void paintComponent(Graphics g) { 

     Graphics2D g2d = (Graphics2D) g; 

     g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
       RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
     g2d.setRenderingHint(RenderingHints.KEY_RENDERING, 
       RenderingHints.VALUE_RENDER_QUALITY); 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, 
       RenderingHints.VALUE_FRACTIONALMETRICS_ON); 

     super.paintComponent(g2d); 
    } 
}; 

FRACTIONALMETRICS hat den größten spürbaren visuellen Effekt auf Text, so dass an der Arbeit ist das, was ich zu tun, bin auf der Suche nach.

hier ist ein Screenshot-Vergleich von, wie es aussieht, wenn ich die App von meinem IDE ausführen (Left), die Java verwendet 6, und wenn ich das Glas seiner Selbst Doppelklick auf Datei (Recht), die mein verwendet Systeme JRE, Java 7. (ich habe auch vorübergehend den roten Rahmen, um zu zeigen, dass die Farbe Methode funktioniert)

Jede Hilfe sehr geschätzt würde.

Antwort

2

Normalerweise muss VALUE_FRACTIONALMETRICS_ON nicht eingestellt werden. Versuchen Sie, die bereitgestellten Desktophinweise zu verwenden. Sie können auch den Swing-Antialiasing-Hinweis aus dem FontRenderContext überprüfen. Beispiel Verwendung ist unten gezeigt.

Wenn Sie den Text bolden möchten, was ein Nebeneffekt von Bruchmetriken ist, würde ich eine fettgedruckte Schriftart bevorzugen oder die Ausgabe zu einem Bild rendern und vor dem Zeichnen weichzeichnen. Das würde eine systemunabhängige Lösung gewährleisten.

import java.awt.*; 
import java.awt.event.*; 
import java.util.Map; 
import javax.swing.JLabel; 

public class TextHints { 
    public static void main(String[] args) { 
     Frame frame = new Frame(); 
     frame.addWindowListener(new WindowAdapter() { 
      @Override 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 
     JLabel label = new JLabel("Sunday, March 17") { 
      @Override 
      protected void paintComponent(Graphics g) { 

       Graphics2D g2d = (Graphics2D) g; 

       Map desktopHints = (Map) Toolkit.getDefaultToolkit().getDesktopProperty("awt.font.desktophints"); 
       if (desktopHints != null) { 
        g2d.addRenderingHints(desktopHints); 
        System.out.println("Desktop: " + desktopHints); 
       } 
       java.awt.FontMetrics fm = getFontMetrics(getFont()); 
       Object swingHint = fm.getFontRenderContext().getAntiAliasingHint(); 
       System.out.println("Swing AntiAliasingHint: " + swingHint); 

       super.paintComponent(g2d); 
      } 
     }; 
     label.setBackground(Color.BLACK); 
     label.setForeground(Color.LIGHT_GRAY); 
     label.setOpaque(true); 

     label.setFont(label.getFont().deriveFont(Font.BOLD, 14f)); 

     frame.add(label); 
     frame.setSize(new Dimension(160, 100)); 
     frame.setVisible(true); 
    } 
} 
+0

Dies scheint nicht zu funktionieren. Ich will es nicht dicker machen, ich will es scharf und sauber machen. Das sieht aus wie das richtige Bild. Ich suche, es wie das linke Bild aussehen, die etwas schlanker ist –

+0

Ich suche nach Sub-Pixel-Rendering von Schriftarten. Aber das scheint nur Java 6 zu sein ... –