2011-10-03 15 views
7

Natywny wygląd systemu Windows LookAndFeel w języku Java 6 wydaje się nieprawidłowo wymiarować niektóre czcionki.Dlaczego Windows LookAndFeel powoduje, że czcionki są zbyt małe?

Program testowy:

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

wyjścia, w porównaniu z natywną aplikacją Windows na Vista:

comparison

Chociaż tekst w pasku testu menu aplikacji jest wielkości poprawnie, reszta tekst jest mniejszy niż w natywnej aplikacji obok niego. Powiększony, można zauważyć, że tekst w aplikacji testowej JLabel 1px jest krótszy niż w natywnej aplikacji:

zoomed in

Jest to błąd w systemie Windows LAF, czy jesteśmy nadużywają go? Jeśli jest to błąd, czy istnieje znane obejście tego problemu?

+0

Dla mnie wygląda na to, że Swing L & F używa innej czcionki. –

+1

+1 Ładnie przygotowane pytanie. –

Odpowiedz

4

Java 6 używa własnego renderera czcionek, w tym implementacji wygładzania/podpowiedzi subpiksela. Podczas, gdy dane wyjściowe mają być podobne do renderowania Windows, albo wierzchołek B znajdujący się na granicy pikseli, albo zaokrąglony, albo oba, powoduje odrzucenie renderera Java. Renderer czcionki Windows decyduje się umieścić górną literę powyżej granicy, podczas gdy Java umieszcza ją poniżej. Litera "l" wygląda tak, jakby była na tej samej wysokości w obu próbkach, więc nie wygląda na to, że renderer ma błędnie wysokość każdej litery. Może spróbuj porównać niektóre litery, w których wierzchołek jest linią prostą, jak T lub E?

Powiązane problemy