【问题标题】:How to use Wingdings font in Java Swing如何在 Java Swing 中使用 Wingdings 字体
【发布时间】:2012-10-06 13:03:05
【问题描述】:

当我尝试使用 Wingdings 字体(或其他符号字体)时,文本显示为矩形而不是正确的文本。如何让正确的字符显示?

import java.awt.*;
import javax.swing.*;

public class WingdingsFontDisplay extends JFrame
{
    public static void main(String[] args)
    {
        new WingdingsFontDisplay();
    }

    public WingdingsFontDisplay()
    {
        this.setSize(500,150);
        this.setTitle("Fun with Fonts");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //This shows that I do have "Wingdings" available
        GraphicsEnvironment g;
        g = GraphicsEnvironment.getLocalGraphicsEnvironment();
        String[] fonts = g.getAvailableFontFamilyNames();
        for(String f : fonts)
        {
            System.out.println(f);
        }

        //Displaying text in the Wingdings font shows rectangles
        JLabel wingdingsText = new JLabel("All work and no play makes Jack a dull boy");
        Font f1 = new Font("Wingdings", Font.PLAIN, 14);
        wingdingsText.setFont(f1);
        this.add(wingdingsText, BorderLayout.NORTH);

        //Displaying text in Arial works correctly
        JLabel arialText = new JLabel("All work and no play makes Jack a dull boy");
        Font f2 = new Font("Arial", Font.PLAIN, 14);
        arialText.setFont(f2);
        this.add(arialText, BorderLayout.SOUTH);

        this.setVisible(true);
    }
}

【问题讨论】:

    标签: java swing wingdings


    【解决方案1】:

    您需要为您寻找的符号使用适当的 Unicode 范围。在 Java 中,符号不会覆盖在 ASCII 范围内,而是有自己独特的字符代码。

    您可以在 http://unicode.org/~asmus/web-wing-ding-ext.pdf 找到对相应符号代码的引用。最常见的符号在 0x2200 和 0x2700 Unicode 范围内。

    您的 Java 安装可能包括 SymbolTest 示例小程序,​​它可以让您直接预览 Unicode 范围与可用字体的表示。但请注意,更好的 Java 实现将使用字体替换符号或字符,而不是指定字体,因此您需要确保您确实获得了指定的字体。

    【讨论】:

    • 谢谢。我下载了 SymbolTest 小程序并通过了它。我意识到我可以通过在字符代码中添加 0x1000 来显示 Wingding 字符。
    • 但我不明白为什么我必须这样做。例如,如果我想打印出字符 65,那么我希望程序打印出字符 65。大多数字体会显示它类似于“A”。 Wingdings 应该将其显示为一只手举起两根手指。
    • @Roy,Unicode 的设计使每个字符值都具有语义含义。无论字体如何,“A”始终表示“A”,而“举起两根手指的手”始终表示“举起两根手指的手”,无论字体如何。这意味着 Unicode 文本总是带有语义含义,即使原始字体不可用,这在国际文本中很常见。浏览 unicode.org 了解更多信息。
    • 更多信息。您的普通字体不支持所有 Unicode,因为您永远不需要支持所有语言。如果一个字体不支持一个字符,有一个指定的字形,比如一个矩形的问号,你可能会看到。在某些情况下也可以使用字体替换,这样即使您没有明确设置适当的字体,您的符号也会显示出来。
    • 字体是否知道每个字符的 Unicode 编号是多少?因此,即使“举起两根手指的手”是 Wingding 字体中的字符 65,它也知道它是 Unicode 0x1041(DEC 4161)?
    猜你喜欢
    • 1970-01-01
    • 2021-05-08
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2014-09-23
    相关资源
    最近更新 更多