2013-03-19 23 views
5

Ho un'applicazione Java desktop su cui sto lavorando e sto utilizzando JDK 6 per lo sviluppo tramite IDE. Io uso il suggerimento di rendering VALUE_FRACTIONALMETRICS_ON insieme ad altri suggerimenti per migliorare il rendering del testo in JLabels. Questi suggerimenti funzionano magnificamente su JVM 1.6, ma di recente ho notato che sembra ignorare completamente il VALUE_FRACTIONALMETRICS_ON quando eseguo l'app con un JRE 1.7 C'è qualcosa che sto facendo male qui che fa sì che Java 7 ignori questi suggerimenti?Come eseguire il rendering del testo utilizzando 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 ha la più grande effetto visivo notevole sul testo in modo da ottenere che il lavoro è quello che sto cercando di fare.

ecco un confronto schermata di quello che sembra quando si esegue l'applicazione dal mio IDE (Sinistra) che usa Java 6 e quando faccio doppio clic sul file Jar sua auto (destro), che usa il mio sistemi di JRE, Java 7. (ho anche temporanea aggiunto il bordo rosso per dimostrare che il metodo paint funziona)

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

2

Normalmente non è necessario impostare VALUE_FRACTIONALMETRICS_ON. Prova a utilizzare i suggerimenti sul desktop forniti. Puoi anche ricontrollare l'hint antialiasing Swing da FontRenderContext. L'esempio di utilizzo è mostrato di seguito.

Se si desidera mettere in grassetto il testo, che è un effetto collaterale delle metriche frazionali, preferirei usare un carattere grassetto, o rendere l'output a un'immagine, e sfocare il disegno prima di disegnarlo. Ciò garantirebbe una soluzione indipendente dal sistema.

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

Questo non sembra funzionare. Non sto cercando di renderlo più spesso, sto cercando di renderlo nitido e pulito. Questo fa sembrare l'immagine giusta. Sto cercando di farlo sembrare l'immagine a sinistra, che è un po 'più sottile –

+0

sto cercando il rendering sub-pixel di caratteri. Ma quello sembra essere Java 6 solo ... –