Source Sans Pro的TTF和OTF版本在Swing(Nimbus L&F)中有不同的显示

TTF: TTF

OTF: OTF

两者都是相同的字体但不同的字体文件类型

我在Windows 7中运行Java 7

根据Adobe的Miguel Sousa的说法,错误不在字体中https://github.com/adobe/source-sans-pro/issues/32#issuecomment-23319673

我只是将默认字体设置为新字体。 TTF版本没有任何问题

Font font_o = Font.createFont(Font.TRUETYPE_FONT, fonts.class.getResourceAsStream("fonts/TTF/SourceSansPro-Regular.ttf")); //Font font_o = Font.createFont(Font.TRUETYPE_FONT, fonts.class.getResourceAsStream("fonts/OTF/SourceSansPro-Regular.otf")); Font font_n=font_o.deriveFont(Font.PLAIN, UIManager.getLookAndFeelDefaults().getFont("defaultFont").getSize()); UIManager.getLookAndFeelDefaults().put("defaultFont",font_n); 

为什么线路高度有差异?

结论(forums.oracle.com/thread/2573652 similair尽可能多的post,没什么特别的)


  • 不是Java,也不是Nimbus bug,这个Font中的bug,你可以看到在Metal,Win,WinClassic和Nimbus Laf,OTF_Font上面丢失2个像素的字形

在此处输入图像描述 。 Windows。 在此处输入图像描述

在此处输入图像描述 。 金属。 在此处输入图像描述

在此处输入图像描述 。 雨云。 在此处输入图像描述

在此处输入图像描述 。 经典。 在此处输入图像描述


Java6上的WinXp

在此处输入图像描述 。 与 。 在此处输入图像描述


  • 此代码将帮助您找到两种字体之间的差异(并将所有差异报告给作者)

  • 从(java.awt.font。)TextAttribute返回具体Font的所有可用属性

  • 你可以从(几乎)所有TextAttributes获得详细的属性

在此处输入图像描述

与输出

 java.awt.font.TextAttribute(family) java.awt.font.TextAttribute(weight) java.awt.font.TextAttribute(width) java.awt.font.TextAttribute(posture) java.awt.font.TextAttribute(size) java.awt.font.TextAttribute(transform) java.awt.font.TextAttribute(superscript) java.awt.font.TextAttribute(char_replacement) java.awt.font.TextAttribute(foreground) java.awt.font.TextAttribute(background) java.awt.font.TextAttribute(underline) java.awt.font.TextAttribute(strikethrough) java.awt.font.TextAttribute(run_direction) java.awt.font.TextAttribute(bidi_embedding) java.awt.font.TextAttribute(justification) java.awt.font.TextAttribute(input method highlight) java.awt.font.TextAttribute(input method underline) java.awt.font.TextAttribute(swap_colors) java.awt.font.TextAttribute(numeric_shaping) java.awt.font.TextAttribute(kerning) java.awt.font.TextAttribute(ligatures) java.awt.font.TextAttribute(tracking) 

来自代码Nimbus L&F

 import java.awt.*; import java.awt.event.*; import java.io.IOException; import java.util.Locale; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.*; import javax.swing.plaf.FontUIResource; import javax.swing.plaf.basic.BasicComboBoxRenderer; public class SystemFontDisplayer { private static final long serialVersionUID = 1L; private JFrame frame = new JFrame("Nimbus UIDeafaults and Font"); private JComboBox fontsBox; private javax.swing.Timer timer = null; private JButton testButton = new JButton("testButton"); private JTextField testTextField = new JTextField("testTextField", JLabel.CENTER); private JLabel testLabel = new JLabel("testLabel"); private Font font1, font2; private JMenuBar menuBar1 = new JMenuBar(); private JMenu menu1= new JMenu("Menu 1"); private JMenu menu2= new JMenu("Menu 2"); private JMenuItem menuItem1= new JMenuItem("MenuItem 1"); private JMenuItem menuItem2= new JMenuItem("MenuItem 2"); public SystemFontDisplayer() { try { font1 = Font.createFont(Font.TRUETYPE_FONT, SystemFontDisplayer.class.getResourceAsStream("/Images/SourceSansPro-Regular.ttf")); font2 = Font.createFont(Font.TRUETYPE_FONT, SystemFontDisplayer.class.getResourceAsStream("/Images/SourceSansPro-Regular.otf")); } catch (FontFormatException ex) { Logger.getLogger(SystemFontDisplayer.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(SystemFontDisplayer.class.getName()).log(Level.SEVERE, null, ex); } GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); //ge.registerFont(font1); ge.registerFont(font2); String[] fontFamilyNames = ge.getAvailableFontFamilyNames(Locale.getDefault()); fontsBox = new JComboBox(fontFamilyNames); fontsBox.setSelectedItem(0); fontsBox.setRenderer(new ComboRenderer()); fontsBox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { final String fontName = fontsBox.getSelectedItem().toString(); fontsBox.setFont(new Font(fontName, Font.PLAIN, 16)); start(); } } }); fontsBox.setSelectedItem(0); fontsBox.getEditor().selectAll(); menu1.add(menuItem1); menuBar1.add(menu1); menu2.add(menuItem2); menuBar1.add(menu2); frame.setJMenuBar(menuBar1); frame.setLayout(new GridLayout(4, 0, 5, 5)); frame.add(fontsBox); frame.add(testButton); frame.add(testTextField); frame.add(testLabel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocation(200, 105); frame.pack(); java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { fontsBox.setPopupVisible(true); fontsBox.setPopupVisible(false); } }); frame.setVisible(true); } private void start() { timer = new javax.swing.Timer(250, updateCol()); timer.setRepeats(false); timer.start(); } public Action updateCol() { return new AbstractAction("text load action") { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { final Font fnt = new Font(fontsBox.getSelectedItem().toString(), Font.PLAIN, 16); try { LookAndFeel lnf = UIManager.getLookAndFeel().getClass().newInstance(); final FontUIResource res = new FontUIResource(fnt); UIDefaults uiDefaults = lnf.getDefaults(); uiDefaults.put("defaultFont", res); UIManager.getLookAndFeel().uninitialize(); UIManager.setLookAndFeel(lnf); } catch (InstantiationException ex) { Logger.getLogger(SystemFontDisplayer.class.getName()).log(Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { Logger.getLogger(SystemFontDisplayer.class.getName()).log(Level.SEVERE, null, ex); } catch (UnsupportedLookAndFeelException ex) { Logger.getLogger(SystemFontDisplayer.class.getName()).log(Level.SEVERE, null, ex); } UIDefaults defaults = UIManager.getDefaults(); final FontUIResource res = new FontUIResource(fnt); Object[] obj = res.getAvailableAttributes(); for (Object objs : obj) { System.out.println(objs); //returns java.awt.font.TextAttribute } defaults.put("defaultFont", res); SwingUtilities.updateComponentTreeUI(frame); frame.pack(); } }; } public static void main(String arg[]) { try { for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(laf.getName())) { UIManager.setLookAndFeel(laf.getClassName()); } } } catch (Exception e) { e.printStackTrace(); } java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { SystemFontDisplayer systemFontDisplayer = new SystemFontDisplayer(); } }); } private class ComboRenderer extends BasicComboBoxRenderer { private static final long serialVersionUID = 1L; @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); final Object fntObj = value; final String fontFamilyName = (String) fntObj; setFont(new Font(fontFamilyName, Font.PLAIN, 16)); return this; } } } 

来自代码Oldies L&Fs

 import java.awt.*; import java.awt.event.*; import java.io.IOException; import java.util.Locale; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.*; import javax.swing.plaf.FontUIResource; import javax.swing.plaf.basic.BasicComboBoxRenderer; public class SystemFontDisplayer extends JFrame { private static final long serialVersionUID = 1L; private JFrame frame = new JFrame("Nimbus UIDeafaults and Font"); private JComboBox fontsBox; private javax.swing.Timer timer = null; private JButton testButton = new JButton("testButton"); private JTextField testTextField = new JTextField("testTextField"); private JLabel testLabel = new JLabel("testLabel"); private Font font1, font2; private JMenuBar menuBar1 = new JMenuBar(); private JMenu menu1 = new JMenu("Menu 1"); private JMenu menu2 = new JMenu("Menu 2"); private JMenuItem menuItem1 = new JMenuItem("MenuItem 1"); private JMenuItem menuItem2 = new JMenuItem("MenuItem 2"); public SystemFontDisplayer() { try { font1 = Font.createFont(Font.TRUETYPE_FONT, SystemFontDisplayer.class.getResourceAsStream("/Images/SourceSansPro-Regular.ttf")); font2 = Font.createFont(Font.TRUETYPE_FONT, SystemFontDisplayer.class.getResourceAsStream("/Images/SourceSansPro-Regular.otf")); } catch (FontFormatException ex) { Logger.getLogger(SystemFontDisplayer.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(SystemFontDisplayer.class.getName()).log(Level.SEVERE, null, ex); } GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); //ge.registerFont(font1); ge.registerFont(font2); String[] fontFamilyNames = ge.getAvailableFontFamilyNames(Locale.getDefault()); fontsBox = new JComboBox(fontFamilyNames); fontsBox.setSelectedItem(0); fontsBox.setRenderer(new ComboRenderer()); fontsBox.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { final String fontName = fontsBox.getSelectedItem().toString(); fontsBox.setFont(new Font(fontName, Font.PLAIN, 16)); start(); } } }); fontsBox.setSelectedItem(0); fontsBox.getEditor().selectAll(); menu1.add(menuItem1); menuBar1.add(menu1); menu2.add(menuItem2); menuBar1.add(menu2); frame.setJMenuBar(menuBar1); frame.setLayout(new GridLayout(4, 0, 20, 20)); frame.add(fontsBox); frame.add(testButton); frame.add(testTextField); frame.add(testLabel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocation(200, 105); frame.pack(); java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { fontsBox.setPopupVisible(true); fontsBox.setPopupVisible(false); } }); frame.setVisible(true); } private void start() { timer = new javax.swing.Timer(750, updateCol()); timer.setRepeats(false); timer.start(); } public Action updateCol() { return new AbstractAction("text load action") { private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) { final Font fnt = new Font(fontsBox.getSelectedItem().toString(), Font.PLAIN, 12); final FontUIResource res = new FontUIResource(fnt); UIManager.getLookAndFeelDefaults().put("Button.font", res); UIManager.getLookAndFeelDefaults().put("TextField.font", res); UIManager.getLookAndFeelDefaults().put("Label.font", res); SwingUtilities.updateComponentTreeUI(frame); frame.pack(); } }; } public static void main(String arg[]) { /*try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); }*/ java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { SystemFontDisplayer systemFontDisplayer = new SystemFontDisplayer(); } }); } private class ComboRenderer extends BasicComboBoxRenderer { private static final long serialVersionUID = 1L; @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); final Object fntObj = value; final String fontFamilyName = (String) fntObj; setFont(new Font(fontFamilyName, Font.PLAIN, 16)); return this; } } } 

  • 有关详细信息,请参阅@ Darryl Burke的Visual Font Designer