JTextPane 的等宽字体/符号

2022-09-04 20:12:50

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

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

这适用于所有类型的字母数字(如 a-z、0-9 等)字符,但当涉及到像 “\u2588” (█) 这样的符号时,字体不再是等宽的。

我忘了什么吗?或者没有包含smybols的等宽字体吗?


答案 1

好吧,首先,在我看来,你试图在这里解决一些不同的事情,所以我将尝试分别解决它们。

1.您需要一种为所有Unicode字符,符号或其他内容等宽的字体。

根据此页面,Unicode 3.2标准定义了12886个字母数字和“符号”字符。Unicode现在是6.0,所以我们可以假设这个数字现在更大了。我在这里还假设“字母数字”意味着英语字符,因为Unicode支持跨越多种语言的100000多个字符。无论如何,12886个英语识别的字符和符号仍然是很多,我怀疑是否有很多免费字体支持所有这些字符和符号。

也就是说,我最终使用大多数需要具有字符支持的单倍行距字体的Java应用程序。它支持您上面提到的“\u2588”字符以及许多其他重要的字符,例如“度”符号。Courier New

2.这种单倍行距字体需要“跨平台”

我可以肯定的是,Mac OS X和所有版本的Windows都支持,我运行的Linux版本也是如此(RedHat...不记得版本号),尽管并非所有Linux版本本身都有这种字体。无论如何。。。你可以尝试看看它是否适合你。如果没有,您可以在线找到用于测试字体/字符支持的免费工具。Courier NewCourier New

最后的思考

我讨厌这样说,但我怀疑有很多字体支持Unicode标准定义的所有字母数字/符号字符,尤其是单倍行距,跨平台和免费的字体。如果可能的话,可能更值得您花时间尝试找出某些符号需要哪些符号,然后选择一种支持这些符号的字体,而您知道您将在其上运行应用程序的平台又支持这种字体。如果你绝对需要支持所有的Unicode符号,不幸的是,它可能不会是免费的。


答案 2

等宽字体适用于OS X,但不适用于Windows。奇怪的是,monospaced被配置为通过fontconfig.properties在Windows上使用Courier New。

我实际上已经将此记录为Oracle的错误;下面是一些示例代码,可在 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等宽上看起来也很好。


推荐