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()
.
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);
}
});
}
}
[è possibile verificare] (http://tips4java.wordpress.com/2008/11/30/visual-font-designer/) se è vero, creato da Darryl Burke – mKorbel
@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