2011-10-03 7 views
7

Parece que Windows LookAndFeel nativo en Java 6 da un tamaño incorrecto a algunas fuentes.¿Por qué Windows LookAndFeel hace que las fuentes sean demasiado pequeñas?

Programa de prueba:

import java.awt.*; 
import java.awt.event.KeyEvent; 
import javax.swing.*; 

public class Test { 
    public static void main(String[] arg) throws Exception { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
     try { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 

     final JMenuBar mb = new JMenuBar(); 

     final JMenu file = new JMenu("File"); 
     file.setMnemonic(KeyEvent.VK_F); 
     mb.add(file); 

     final JToolBar toolbar = new JToolBar(); 
     final JButton button = new JButton("Button"); 
     toolbar.add(button); 

     final JLabel label = new JLabel("Basic Colors"); 

     final JPanel panel = new JPanel(new BorderLayout()); 
     panel.add(toolbar, BorderLayout.PAGE_START); 
     panel.add(label, BorderLayout.CENTER);  

     final JFrame frame = new JFrame(); 
     frame.setJMenuBar(mb); 
     frame.add(panel); 

     frame.setTitle("Test"); 
     frame.setSize(400,200); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     } 
    }); 
    } 
} 

de salida, en comparación con una aplicación nativa de Windows en Vista:

comparison

Si bien el texto en la barra de menú de la aplicación de pruebas tiene el tamaño correcto, el resto de el texto es más pequeño que en la aplicación nativa junto a él. El zoom, se puede ver que el texto en la aplicación de prueba JLabel es de 1 píxel más corto que en la aplicación nativa:

zoomed in

Es esto un error en las FAL de Windows, o estamos haciendo mal uso de ella? Si es un error, ¿hay una solución conocida?

+0

Para mí, parece que Swing L & F usa una fuente diferente. –

+1

+1 Pregunta bien preparada. –

Respuesta

4

Java 6 usa su propio procesador de fuentes, incluida la implementación del antialiasing/sugerencia de subpíxeles. Si bien la salida debe ser similar a la representación de Windows, ya sea que la parte superior de B esté en un límite de píxel, o esté redondeada, o ambas, arroja el renderizador de Java apagado. El renderizador de fuentes de Windows decide colocar la parte superior de la letra sobre el límite, mientras que el de Java lo coloca debajo. La 'l' parece estar a la misma altura en ambas muestras, por lo que no parece que el renderizador tenga el valor correcto de cada letra. Tal vez intente comparar con algunas letras donde la parte superior es una línea recta, como una T o una E?

Cuestiones relacionadas