2011-10-03 56 views
7

Java 6中的本地Windows LookAndFeel似乎錯誤地設置了某些字體的大小。爲什麼Windows LookAndFeel使字體太小?

測試程序:

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

輸出,與Vista的Windows的原生應用程序相比:

comparison

雖然在測試應用程序菜單欄中的文本的大小正確,其餘的該文本比在其旁邊的本地應用程序中的文本更小。放大時,你可以看到,在測試程序文本的JLabel比原生應用程式短1px的:

zoomed in

這是在Windows籌集到的錯誤,還是我們濫用呢?如果這是一個錯誤,是否有一個已知的解決方法?

+0

對我來說,看起來好像Swing L&F使用不同的字體。 –

+1

+1準備好的問題。 –

回答

4

Java 6使用自己的字體渲染器,包括subpixel antialiasing/hinting whatsit的實現。儘管輸出與Windows的渲染類似,但B的頂部位於像素邊界,或者四捨五入,或兩者都會拋出Java渲染器。 Windows字體渲染器決定將字母的頂部放在邊界之上,而Java將它放在下面。 'l'看起來好像在兩個樣本中都處於同一高度,所以看起來渲染器看起來並不像每個字母的高度都是錯的。也許嘗試與頂部是直線的一些字母比較,如T或E?