首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将字体导入GUI

将字体导入GUI
EN

Stack Overflow用户
提问于 2012-05-03 00:32:00
回答 3查看 4.5K关注 0票数 1

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

EN

回答 3

Stack Overflow用户

发布于 2012-05-03 00:46:51

默认情况下,可用的数量通常超过5个,但不同的系统会有所不同。这个答案既检查了现有的字体,也检查了如何加载和注册新字体。

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

代码语言:javascript
复制
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));
    }
}

好吧,这很有趣,但是这个字体到底是什么样子的呢?

代码语言:javascript
复制
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);
    }
}
票数 6
EN

Stack Overflow用户

发布于 2012-05-03 00:39:03

你可以尝试这样做:

代码语言:javascript
复制
Font font = Font.createFont(Font.TRUETYPE_FONT, fontStream);

接下来,

代码语言:javascript
复制
GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(font);

和,

代码语言:javascript
复制
new Font("nameOfFont", Font.BOLD, 13)
票数 3
EN

Stack Overflow用户

发布于 2012-09-27 23:54:14

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

1) FontLibrary类:

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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结构:

代码语言:javascript
复制
<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)加载字体:

代码语言:javascript
复制
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的第五天做了这个,所以它远不是完美的,但它可以做好工作

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10417907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档