2011-10-03 9 views
7

L'aspetto nativo di Windows LookAndFeel in Java 6 sembra erroneamente ridimensionare alcuni tipi di carattere.Perché Windows LookAndFeel rende i caratteri troppo piccoli?

programma di test:

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); 
     } 
    }); 
    } 
} 

uscita, a fronte di un'applicazione nativa di Windows su Vista:

comparison

Mentre il testo nella barra dei menu applicazione di test è dimensionato correttamente, il resto il testo è più piccolo rispetto all'app nativa accanto. Zoom avanti, si può vedere che il testo nella applicazione di test JLabel è 1px più corto in app nativa:

zoomed in

È questo un bug nel Windows LAF o siamo cattivo uso esso? Se si tratta di un bug, c'è una soluzione nota?

+0

Per me sembra che Swing L & F utilizzi un font diverso. –

+1

+1 Domanda ben preparata. –

risposta

4

Java 6 utilizza il proprio renderer di font, compresa l'implementazione di antialiasing subpixel/hinting whatsit. Sebbene l'output sia simile al rendering di Windows, sia la parte superiore di B che si trova al limite di un pixel, sia quella arrotondata, o entrambi, getta via il renderer Java. Il renderer dei caratteri di Windows decide di posizionare la parte superiore della lettera sopra il confine, mentre quella di Java la pone sotto. La 'l' sembra che sia alla stessa altezza in entrambi i campioni, quindi non sembra che il renderer abbia sbagliato l'altezza di ogni lettera. Forse provare a confrontare con alcune lettere in cui la cima è una linea retta, come una T o una E?

Problemi correlati