2013-03-19 11 views
5

Mam aplikację Java na komputery stacjonarne, nad którą pracuję i korzystam z JDK 6 do programowania za pośrednictwem IDE. Korzystam z podpowiedzi renderowania VALUE_FRACTIONALMETRICS_ON wraz z innymi wskazówkami, aby lepiej renderować tekst w JLabels. Wskazówki te działają pięknie na JVM 1.6, ale ostatnio zauważyłem, że całkowicie ignoruje on VALUE_FRACTIONALMETRICS_ON, gdy uruchamiam aplikację z JRE 1.7. Czy jest coś, co robię źle, co sprawia, że ​​Java 7 ignoruje te wskazówki?Jak renderować tekst za pomocą FRACTIONALMETRICS w języku 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 ma największy zauważalny efekt wizualny tekst tak, że uzyskanie do pracy jest to, czego szukam zrobić.

o to ekran porównanie strzał, jak to wygląda, kiedy uruchomić aplikację z mojego IDE (Lewicy), który używa Java 6 i kiedy kliknij dwukrotnie Jar złożyć swój własny (Prawy), która wykorzystuje moje systemy JRE, Java 7. (ja również tymczasowy dodał czerwoną ramkę, aby pokazać, że metoda malowania działa)

Każda pomoc będzie bardzo mile widziane.

Odpowiedz

2

Zazwyczaj nie ma potrzeby ustawiania wartości VALUE_FRACTIONALMETRICS_ON. Spróbuj skorzystać z podanych wskazówek na pulpicie. Możesz również dwukrotnie sprawdzić wskazówkę dotyczącą wygładzania antyaliasingowego Swing z FontRenderContext. Przykładowe zastosowanie pokazano poniżej.

Jeśli chcesz pogrubić tekst, który jest efektem ubocznym ułamkowych metryk, wolałbym używać pogrubionej czcionki lub renderować obraz wyjściowy i rozmazać go przed rysowaniem. To zapewniłoby niezależne od systemu rozwiązanie.

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

To nie wydaje się działać. Nie zamierzam sprawić, by był grubszy, dlatego chcę, by był ostry i czysty. To sprawia, że ​​wygląda jak prawo obraz. Szukam, aby wyglądał jak lewy obraz, który jest nieco cieńszy –

+0

Szukam pod-pikseli renderowania czcionek. Ale wydaje się, że tylko Java 6 ... –

Powiązane problemy