我正在编写一个包含2个面板的应用程序.一个JTextArea用于输入文本,另一个用于显示文本.
在这些文本中,我有两个特殊字符,即STX / ETX(ASCII中为0x02、0x03).
当我输入这些字符时,它们显示为不可见或其他符号.我想像在记事本中一样使它们可见和可复制:
谁能为我指出一个解决方案,该解决方案如何使用(可能是自定义的)JTextArea实现?
是否可以覆盖字体图像或类似内容?
对于我的其他观点,在不需要操纵文本的地方,我将使用html将这些字符显示为图像(如果您知道更好的解决方案,请告诉我).
解决方法:
用图像替换控制字符是可行的,但是,这似乎占用了CPU资源并使GUI滞后.
更好的解决方案是在修改后的TrueType字体文件中使用字形.您可以为STX,ETX等绘制一个字形并将其添加到字体文件中,但是要重现在Notepadd中看到的Scintilla字形需要大量的工作.
您可以使用另一种简单的方法:
>下载一个类似UbuntuMono-R.ttf的TTF文件,在FontForge中打开该文件,您可以在列表的开头看到所有本机字形的列表以及空的控制字符.
>在FontForge中打开另一个Digit.ttf之类的TTF文件,然后复制您感兴趣的字符并将其粘贴在列表的开头.在这里,我粘贴了带圆圈的数字,它们表示控制字符的十六进制代码.
>生成包含您的控制字符表示形式的新TTF文件.
>将字体文件嵌入您的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);
}
>实例化字体并将其应用于JTextComponent:
public static final Font FONT_UBUNTU = new Font("Ubuntu Mono", Font.PLAIN, 12);
如果有人找到原始的Scintilla字形或自己绘制,将其添加到FontForge的列表中,然后您会在文本组件中看到它们,则过程将是相同的(我已测试并在http://fontstruct.com上逐像素绘制了控制字符EOT,在Swing中还可以,但是我懒得画其余的部分).