【问题标题】:Importing Font to GUI将字体导入 GUI
【发布时间】:2012-05-12 04:08:54
【问题描述】:

除了swing 似乎附带的基本5 之外,我正在尝试更改我的GUI 的字体。如何导入字体并在我的代码中实际使用它们?

【问题讨论】:

    标签: java swing user-interface fonts awt


    【解决方案1】:

    这是一种加载字体的方法,这些字体打包在一个 jar 文件 + 一个 xml 文件中,以读出 字体大小、字体名称和字体文件名

    1) FontLibrary 类:

    package be.nicholas.font.loading;
    
    import java.awt.Font;
    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    import be.nicholas.font.CustomFont;
    import be.nicholas.utils.Logger;
    import be.nicholas.utils.Misc;
    
    public class FontLibrary {
    
        public static Map<String, Font> fonts = null;
        private static Logger logger = Logger.getInstance();
    
        public FontLibrary() { }
    
        /**
         * Get the font by it's name.
         * @param fontname the font name
         * @return The font for the given id if it exists.
         */
        public static Font getFont(String fontname)
        {
            Font f = FontLibrary.fonts.get(fontname);
            if(f == null)
            logger.error("Font ("+fontname+") could not be found.");
            return f;
        }
    
    
        /**
         * Get the font by it's name and change the fontsize
         * @param fontname the font name.
         * @param fontsize 
         * @return Font
         */
        public static Font getFont(String fontname, int fontsize)
        {
            Font f = FontLibrary.fonts.get(fontname).deriveFont((float) fontsize);
            if(f == null)
            logger.error("Font ("+fontname+") could not be found.");
            return f;
        }
    
        public static void load() 
        {
            try 
            {
                InputStream fontStream = FontLibrary.class.getResourceAsStream("/data/fonts/fonts.xml");
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.parse(fontStream);
                doc.getDocumentElement().normalize();
    
                NodeList nList = doc.getElementsByTagName("font");
    
                fonts = new HashMap<String, Font>();
                logger.error("Starting to load fonts...");
                for (int temp = 0; temp < nList.getLength(); temp++) 
                {
                   Node nNode = nList.item(temp);
                   if (nNode.getNodeType() == Node.ELEMENT_NODE) 
                   {
                      Element fontElement = (Element) nNode;
    
                      CustomFont f = new CustomFont();
                      f.setName(getTagValue("name", fontElement));
                      f.setFont(CustomFont.load(getTagValue("filename", fontElement), Integer.parseInt(getTagValue("fontsize", fontElement))));
                      f.setSize(Integer.parseInt(getTagValue("fontsize", fontElement)));
    
                      fonts.put(f.getName(), f.getFont());
    
                      /**
                       * Calculate percentage
                       */
    
                      int percent = Misc.getPercentage(fonts.size(), nList.getLength());
                      String msg = percent+"% of fonts loaded("+fonts.size()+" of "+nList.getLength()+")"; 
    
    
                   }
    
                }
    
    
            } catch (Exception e) {
                logger.error("Error: "+e);
    
            }
            logger.error("All fonts loaded!"+"("+fonts.size()+" fonts int total).");
            //logger.info(fonts.size()+" = size of fontsmap. -> name ofzo: "+fonts.get("rssmall"));
    
        }
    
    
          private static String getTagValue(String sTag, Element eElement) 
          {
                NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
                Node nValue = (Node) nlList.item(0);
                return nValue.getNodeValue();
          }
    
    }
    

    2) CustomFont 类:

    package be.nicholas.font;
    
    import java.awt.Font;
    import java.io.InputStream;
    
    import be.nicholas.font.loading.FontLibrary;
    import be.nicholas.utils.Misc;
    
    public class CustomFont {
    
        public String name;
        public Font fontObject;
        public int size;
    
        public CustomFont() {
            //super(font);
    
        }
    
        public void setFont(Font fontObject)
        {
            this.fontObject = fontObject;
        }
    
        public Font getFont()
        {
            return this.fontObject;
        }
    
        public void setName(String name)
        {
            this.name = name;
        }
    
        public String getName()
        {
            return this.name;
        }
    
        public void setSize(int size)
        {
            this.size = size;
        }
    
        public int getSize()
        {
            return this.size;
        }
    
    
        public static Font load(String filename,int fontSize)
        {
            InputStream fontStream = CustomFont.class.getResourceAsStream("/be/nicholas/fonts/"+filename);
            if (fontStream != null) 
            {
                try 
                {
                    Font labelFont;
                    labelFont = Font.createFont(Font.TRUETYPE_FONT, fontStream);
                    labelFont = labelFont.deriveFont((float) fontSize);
                    return labelFont;
    
                } catch (Exception e) 
                {
                    System.out.println("error " + e);
                }
    
            } 
            return null;
        }
    
    }
    

    3) XML 结构:

    <fonts>
        <font>
            <name>mycustomfontname</name>
            <filename>myfont.ttf</filename>
            <fontsize>16</fontsize>
        </font>
        <font>
            <name>champagne</name>
            <filename>ChampagneAndLimousines.ttf</filename>
            <fontsize>50</fontsize>
        </font>
    </fonts>
    

    4) 加载字体:

    JLabel label = new JLabel('testText');
    //load it with the default given font size
    label.setFont(FontLibrary.fonts.get("mycustomfontname"));
    //load a font with a custom font size:
    label.setFont(FontLibrary.fonts.get("mycustomfontname").deriveFont(22));
    

    我希望这会有所帮助:)...我是一个真正的 java 新手,我在玩 java 的第 5 天做了这个,所以它远非完美,但它会完成这项工作

    【讨论】:

      【解决方案2】:

      默认情况下通常有 5 个以上可用,但它们会因系统而异。这个答案检查了现有字体,以及如何加载和注册新字体。

      它使用Download Free Fonts 提供的“Airacobra Condensed”字体(通过热链接 URL 获得)。应用程序 Jar 中的字体。也可以通过 URL 访问。

      import java.awt.*;
      import javax.swing.*;
      import java.net.URL;
      
      class LoadFont {
          public static void main(String[] args) throws Exception {
              // This font is < 35Kb.
              URL fontUrl = new URL("http://www.webpagepublicity.com/" +
                  "free-fonts/a/Airacobra%20Condensed.ttf");
              Font font = Font.createFont(Font.TRUETYPE_FONT, fontUrl.openStream());
              GraphicsEnvironment ge = 
                  GraphicsEnvironment.getLocalGraphicsEnvironment();
              ge.registerFont(font);
              JList fonts = new JList( ge.getAvailableFontFamilyNames() );
              JOptionPane.showMessageDialog(null, new JScrollPane(fonts));
          }
      }
      

      好的,这很有趣,但是这个字体实际上是什么样子的?

      import java.awt.*;
      import javax.swing.*;
      import java.net.URL;
      
      class DisplayFont {
          public static void main(String[] args) throws Exception {
              URL fontUrl = new URL("http://www.webpagepublicity.com/" +
                  "free-fonts/a/Airacobra%20Condensed.ttf");
              Font font = Font.createFont(Font.TRUETYPE_FONT, fontUrl.openStream());
              font = font.deriveFont(Font.PLAIN,20);
              GraphicsEnvironment ge =
                  GraphicsEnvironment.getLocalGraphicsEnvironment();
              ge.registerFont(font);
      
              JLabel l = new JLabel(
                  "The quick brown fox jumped over the lazy dog. 0123456789");
              l.setFont(font);
              JOptionPane.showMessageDialog(null, l);
          }
      }
      

      【讨论】:

      • +1 不错的答案,包括示例、屏幕截图和所有内容。这是老生常谈的答案
      【解决方案3】:

      你可以试试这个:

      Font font = Font.createFont(Font.TRUETYPE_FONT, fontStream);
      

      接下来,

      GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(font);
      

      还有,

      new Font("nameOfFont", Font.BOLD, 13)
      

      【讨论】:

      • 对于第三行,我不会将第一行的字体设置为新字体的值吗?
      • 是的。您可以使用GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFontsgetFontName() 恢复所有字体,以了解名称。我已经看到新字体是最后一个(在 Java 7 窗口上)
      猜你喜欢
      • 1970-01-01
      • 2022-12-30
      • 2015-01-07
      • 2013-03-28
      • 1970-01-01
      • 2014-11-07
      • 2018-08-18
      • 2018-02-22
      • 2021-09-20
      相关资源
      最近更新 更多