JTextArea 中控制字符的 Java 图像

2024-04-17

我正在编写一个由 2 个面板组成的应用程序。一个 JTextArea 用于输入文本,另一个用于显示文本。

In these texts I have two special characters namely STX/ETX (0x02, 0x03 in ASCII). When I enter these characters they are shown as invisible or some other symbol. I would like to make them visible and copyable like in Notepad++: notepad++ special characters example

谁能给我指出一个解决方案,如何使用(可能是自定义的)JTextArea 来实现这一目标? 是否可以覆盖字体图像或类似的东西?

对于我的另一个观点,我不需要操纵文本,我将有 html 将这些字符显示为图像(如果您知道更好的解决方案,请告诉我)。


用图像替换控制字符是可行的,但它似乎会占用 CPU 资源并使 GUI 滞后。

更好的解决方案是在修改后的 TrueType 字体文件中使用字体字形。您可以为 STX、ETX 等绘制字形并将它们添加到字体文件中,但重现您在 Notepadd++ 中看到的 Scintilla 字形需要大量工作。

您可以使用另一种简单的方法:

  1. 下载像 UbuntuMono-R.ttf 这样的 TTF 文件,在 FontForge 中打开该文件,您可以在列表开头看到所有本机字形和空控制字符的列表。
  2. 在 FontForge 中打开另一个 TTF 文件(如 Digits.ttf),复制您感兴趣的字符并将其粘贴到列表的开头。这里我粘贴了代表控制字符的十六进制代码的带圆圈的数字。
  3. 生成新的 TTF 文件,其中包含您的控制字符表示形式。
  4. 将字体文件嵌入到您的 jar 中并将其注册到您的应用程序中:

    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    try (InputStream fontStream = new BufferedInputStream(SwingAppender.class.getResourceAsStream("/com/jsql/view/swing/resources/font/UbuntuMono-Regular-new.ttf"))) {
        Font ubuntuFont = Font.createFont(Font.TRUETYPE_FONT, fontStream);
        ge.registerFont(ubuntuFont);
    } catch (FontFormatException | IOException e) {
        LOGGER.warn("Loading Font Ubuntu failed", e);
    }
    
  5. 实例化字体并将其应用到 JTextComponent:

    public static final Font FONT_UBUNTU = new Font("Ubuntu Mono", Font.PLAIN, 12);
    

如果有人找到原始的 Scintilla 字形或自己绘制它,将它们添加到 FontForge 中的列表中,您将在文本组件中看到它们(我已经在http://fontstruct.com http://fontstruct.com,在Swing中还可以,但是我懒得画其余的了)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JTextArea 中控制字符的 Java 图像 的相关文章

随机推荐