2013-05-16 14 views
8

Sto cercando di utilizzare OpenDyslexic come opzione di carattere in un'applicazione Swing. Ma sorprendentemente, OpenDyslexic sembra molto più grande di qualsiasi altro font con le stesse dimensioni, anche se sembra di dimensioni normali in altre applicazioni. Ho provato una manciata di altri font OpenType, e non sembrano particolarmente grandi o piccoli. Perché OpenDyslexic è così grande in Java, e come posso ottenere Java per ridimensionarlo normalmente, quindi non devo avere le dimensioni speciali di OpenDyslexic?Perché questo font è così grande in Java?

Su Oracle JRE (ho provato 1.7.0_11, 1.7.0_15 e l'ultima 1.7.0_21) su tutti i sistemi operativi, il carattere è troppo grande quando Java carica il file di font utilizzando Font.createFont. Tuttavia, quando ho installo il tipo di carattere nel sistema operativo, il comportamento è diverso su tutte e 3 le piattaforme:

  • In Linux, l'installazione del font da ~/.fonts non fa bene. Lo screenshot sembra lo stesso prima di installare il font e dopo averlo installato.
  • In Windows, l'installazione del carattere corregge il font glifi, ma il font spaziatura è ancora troppo grande! Vedi la schermata qui sotto.
  • In OS X, l'installazione del font lo risolve! Si presenta come un carattere di dimensioni normali su OS X.

Aggiornamento: È interessante notare che, OpenJDK (sia il 7u21 pacchetti di Ubuntu Linux e l'accumulo obuildfactory su OS X) non non mostra il bug. L'OpenDyslexic 'm' di 15pt è largo 15px su OpenJDK, come dovrebbe essere, sia quando il font viene creato da file sia quando il font viene gestito dal sistema operativo. Il bug si trova nell'ultimo Oracle JRE ma non nell'ultimo OpenJDK.

Ecco il mio programma di esempio. Si noti che per provarlo, è necessario inserire i file OpenDyslexic in risorse /. In alternativa, installa OpenDyslexic nel tuo sistema ed elimina la chiamata registerFonts().

SansSerif is normal sizeOpenDyslexic is huge at the same point sizeAfter installing OpenDyslexic on Windows, it looks stupidAfter installing font on OS X: perfect!

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.Font; 
import java.awt.FontFormatException; 
import java.awt.GraphicsEnvironment; 
import java.io.IOException; 
import java.io.InputStream; 
import java.lang.reflect.InvocationTargetException; 
import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Locale; 

import javax.swing.DefaultComboBoxModel; 
import javax.swing.DefaultListCellRenderer; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 
import javax.swing.WindowConstants; 
import javax.swing.event.ListDataEvent; 
import javax.swing.event.ListDataListener; 

public class FontFrame { 
    /** 
    * Register extra fonts from resources. If you already have it installed on 
    * the computer, you can skip this. 
    */ 
    private static void registerFonts() { 
     String[] resources = { 
      "OpenDyslexic-Regular.otf", 
      "OpenDyslexic-Italic.otf", 
      "OpenDyslexic-Bold.otf", 
      "OpenDyslexic-BoldItalic.otf" 
     }; 
     GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     for (String filename: resources) { 
      InputStream stream = FontFrame.class.getResourceAsStream("resources/" + filename); 
      try { 
       Font font = Font.createFont(Font.TRUETYPE_FONT, stream); 
       ge.registerFont(font); 
      } catch (FontFormatException | IOException e) { 
       throw new IllegalStateException(e); 
      } 
     } 
    } 
    private static void createUI(boolean allFonts) { 
     final JTextArea textArea = new JTextArea(
       "Font created to help dyslexic readers. " + 
       "Bottom heavy and unique character shapes help " + 
       "prevent letters and numbers from being confused."); 
     textArea.setWrapStyleWord(true); 
     textArea.setLineWrap(true); 
     final DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>(); 
     if (allFonts) { 
      GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
      HashSet<Object> seenFamilies = new HashSet<>(); 
      Font[] fonts = ge.getAllFonts(); 
      for (Font font: fonts) { 
       String familyName = font.getFamily(Locale.ENGLISH); 
       if (seenFamilies.contains(familyName)) 
        continue; 
       seenFamilies.add(familyName); 
       model.addElement(familyName); 
      } 
     } else { 
      model.addElement("SansSerif"); 
      model.addElement("OpenDyslexic"); 
     } 

     final int fontSize = 15; 
     textArea.setFont(new Font("SansSerif", Font.PLAIN, fontSize)); 
     model.addListDataListener(new ListDataListener() { 
      @Override public void intervalRemoved(ListDataEvent e) {} 
      @Override public void intervalAdded(ListDataEvent e) {} 
      @Override public void contentsChanged(ListDataEvent e) { 
       if (e.getIndex0() == -1 && e.getIndex1() == -1) { 
        SwingUtilities.invokeLater(new Runnable() { @Override public void run() { 
         String selectedFamily = (String) model.getSelectedItem(); 
         Font font = new Font(selectedFamily, Font.PLAIN, fontSize); 
         textArea.setFont(font); 
        }}); 
       } 
      } 
     }); 
     JComboBox<String> familyChooser = new JComboBox<>(model); 
     familyChooser.setMaximumRowCount(50); 
     familyChooser.setRenderer(new DefaultListCellRenderer() { 
      private static final long serialVersionUID = 1L; 
      public Component getListCellRendererComponent(JList<?> list, 
        Object value, int index, boolean isSelected, 
        boolean cellHasFocus) { 
       Component comp = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
       String familyName = (String) value; 
       Font font = new Font(familyName, Font.PLAIN, fontSize); 
       comp.setFont(font); 
       return comp; 
      } 
     }); 

     JPanel jpanel = new JPanel(); 
     jpanel.setLayout(new BorderLayout()); 
     jpanel.add(familyChooser, BorderLayout.NORTH); 
     jpanel.add(textArea, BorderLayout.CENTER); 
     JFrame jframe = new JFrame(); 
     jframe.getContentPane().add(jpanel); 
     jframe.setSize(300, 300); 
     jframe.invalidate(); 
     jframe.setVisible(true); 
     jframe.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
    } 
    public static void main(String[] args) throws InvocationTargetException, InterruptedException { 
     registerFonts(); 
     final boolean allFonts = Arrays.asList(args).contains("--all"); 
     SwingUtilities.invokeAndWait(new Runnable() { 
      @Override public void run() { 
       createUI(allFonts); 
      } 
     }); 
    } 
} 
+0

[è possibile verificare] (http://tips4java.wordpress.com/2008/11/30/visual-font-designer/) se è vero, creato da Darryl Burke – mKorbel

+0

@mKorbel, il carattere sembra lo stesso in Visual Font Designer Demo come fa quando si guarda il font installato. Su OS X sembra buono, ma su altre piattaforme sembra male. (Nota che ho aggiornato la domanda per descrivere l'installazione del font su piattaforme diverse.) – yonran

risposta

1

Non tutte le versioni di Java supporta OpenType (cfr this overview). Se riesci a vivere senza alcune delle funzionalità di OpenType, la soluzione più semplice sarebbe convertire il file del font in TTF. Sembra che ci sia un paio di free online options per aiutarti e se questo risolve il tuo problema puoi comunque investire in software professionali per ottenere risultati migliori.

+0

Ma la pagina web che hai linkato sostiene che Java su Windows supporta OpenType (entrambe le varianti TrueType e PostScript), e Windows in realtà sembrava il peggiore. – yonran

+0

Dato che non è una dichiarazione ufficiale, il take away per me sarebbe che l'OTF può causare problemi. La specifica reificazione di questi problemi potrebbe dipendere anche da altri fattori come la versione del sistema operativo. // D'altra parte, personalmente ho sempre avuto problemi con i font PS, e convertirli era la soluzione. Ci sono altri motivi che ti impediscono di provarlo? Ad esempio, non ho letto la licenza OpenDyslexic ... – Tilo

+0

Grazie Tilo.Dopo aver convertito il font da otf a ttf, ha le dimensioni corrette su tutte le piattaforme, sia quando è installato sia quando viene caricato dal file di font. – yonran