JTextPane的等宽字体/符号

14

我想使用JTextPane构建类似控制台的输出。因此,我正在使用等宽字体:

textpane.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));

这对于所有的字母数字(如a-z, 0-9等)都很好用,但是当涉及到像'\u2588'(█)这样的符号时,字体不再是等宽字体了。

我是忘记了什么吗?还是没有包含符号的等宽字体?

2个回答

16

首先,听起来你在尝试解决几个不同的问题,所以我会分开回答。

1. 你需要一种支持所有Unicode字符、符号或其他符号的等宽字体。

根据这个页面,Unicode 3.2标准定义了12886个字母数字和“符号”字符。现在Unicode已经更新到6.0,因此我们可以假设该数字现在更大。我还假设“字母数字”是指英文字符,因为Unicode支持超过100000个跨越许多语言的字符。无论如何,12886个英语字符和符号仍然很多,我怀疑有很少免费字体支持它们所有。

话虽如此,我最终使用Courier New作为大多数需要支持字符的Java应用程序的单间距字体。它支持你上面提到的'\u2588'字符以及许多其他重要字符,例如“度”符号。

2. 这种等宽字体需要“跨平台”。

我确定Mac OS X和所有Windows版本都支持Courier New,我运行的Linux版本也支持(RedHat...忘记版本号了),尽管并不是所有Linux版本都原生支持该字体。无论如何...你可以尝试使用Courier New,看看它是否适合你。如果不行,你可能可以在网上找到免费的工具来测试字体/字符支持。

最后的想法

我不想说,但我怀疑市面上很少有字体支持Unicode标准所定义的所有字母数字/符号字符,更不用说是等宽、跨平台并且免费的了。如果可能的话,你也许更值得花时间去找出你需要哪些符号,然后选择支持这些符号的字体,并且这些字体在你知道自己将要运行应用程序的平台上也能被支持。如果你绝对需要支持所有Unicode符号,那么很遗憾,它很可能不会是免费的。


我所说的字母数字字符是指a-Z、0-9等。Courier New对我来说效果很好。 - user28061
我推荐使用Source Code Pro作为一个漂亮的免费跨平台字体。你需要将它打包到你的安装程序中,或者让用户手动安装它。https://github.com/adobe-fonts/source-code-pro/releases - Appak

3

等宽字体在OS X上可以使用,但在Windows上不行。奇怪的是,通过fontconfig.properties将等宽字体配置为在Windows上使用Courier New。

我已经将这个问题记录为Oracle的一个bug;以下是一些示例代码,在OS X上正确呈现,但等宽字体在Windows上会产生方框。

import java.awt.BorderLayout;
import java.awt.Font;

import javax.swing.JEditorPane;
import javax.swing.JFrame;

public class Test {

    public static void main(String[] args) {
        JFrame f = new JFrame("editor test");
        f.getContentPane().setLayout(new BorderLayout());
        f.add(pane("monospaced"), BorderLayout.NORTH);
        f.add(pane("Courier New"), BorderLayout.SOUTH);
        f.pack();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

  private static JEditorPane pane(final String name) {
    JEditorPane p = new JEditorPane();
    final Font currFont = p.getFont();
    p.setFont(new Font(name, currFont.getStyle(), currFont.getSize()));
    p.setText(name + " - 8\u1d00.\u1d0d.");
    return p;
  }
}

我尝试添加\u2588,这在OS X等宽字体上看起来很好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接