2013-08-27 4 views
3

TTF: ttfTTF и OTF версии Source Sans Pro по-разному отображаются в свинг (Nimbus L & F)

ОПФ: otf

оба тот же шрифт, но различные типы fontfile

Я бегу Java 7 в Windows 7

по словам Мигеля Соуза по Adobe ошибка, не в шрифтах 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); 

Почему существует разница в LineHeight?

+0

нет, вы не поняли что-то. не уверен, что нет, я удаляю свой ответ здесь, чтобы избежать дальнейших дискуссий о – mKorbel

+0

и что я неправильно понял? Я попробовал версию ttf здесь: отлично смотрится, а затем попробовал версию otf (комментируя версию ttf) lokks не то же самое, см. 2 изображения выше и увидеть пространство над «O» –

+0

Я вижу это, но я пытаясь избежать любой отладки методов на моей стороне, ничего больше :-) – mKorbel

ответ

3

вывод (forums.oracle.com/thread/2573652 similair как многие его пост там, ничего особенного)


  • не правда, что Java, ни Nimbus ошибка, это ошибка в Font, вы можете видеть, что в металле, Win, WinClassic и Nimbus Laf, OTF_Font отсутствует 2pixels выше глифа

enter image description here. Windows. enter image description here

enter image description here. Металл. enter image description here

enter image description here. Нимбус. enter image description here

enter image description here. Классический. enter image description here


WinXp на Java6

enter image description here. против . enter image description here


  • этот код поможет вам найти разность (х года) между двумя шрифтами (и сообщать о всех Diff, чтобы автор)

  • возвращает все доступное atributes из (java.awt.font ,) TextAttribute для конкретного шрифта

  • вы можете получить подробные свойства из (почти) все TextAttributes

enter image description here

с выходом

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

+0

, как это помогает мне сравнить версию otf и ttf Adobe Source Sans Pro? Также он не печатает значения атрибутов на консоли, а только какие атрибуты существуют, вы взглянули на проблему Github? –

+0

'1), как это помогает мне сравнить версию otf и ttf Adobe Source Sans Pro? --- --- каждый из Font имеет много атрибутов, одна из которых - вставки, пустые границы, доступное пространство для отображения более высокого уровня Unicodes глиф '2) Также он не печатает значения атрибутов на консоли, а только какие атрибуты существуют. ---> снова вы можете получить подробные свойства из всех атрибутов. 3) причина для визуального конструктора шрифтов by @ Darryl Burke и don 're изобретать колесо в моем ответе здесь' 4) вы взглянули на вопрос Github? --- --- стандартный ответ для OpenSource ... – mKorbel

+0

нет, вы что-то неправильно поняли. Я использую шрифт Source Sans Pro от Adobe. И я использую otf или ttf версию этого шрифта. Только шрифт otf имеет некоторые проблемы (высота строки?), Но Miguel от Adobe говорит, что они оба одинаковы. Вы можете просто выбрать одну версию шрифта из списка (ttf или otf?), но вы не можете сравнивать их или выбирать между версиями otf и ttf, чтобы сравнивать их напрямую. –

 Смежные вопросы

  • Нет связанных вопросов^_^