JTextArea中控制字符的Java图像

JTextArea中控制字符的Java图像,java,text,fonts,controls,character,Java,Text,Fonts,Controls,Character,我正在写一个由两个面板组成的应用程序。一个JTextArea用于输入文本,另一个用于显示文本 在这些文本中,我有两个特殊字符,即STX/ETX(ASCII中的0x02、0x03)。 当我输入这些字符时,它们显示为不可见或其他符号。我想让它们像记事本一样可见和可复制: 有人能告诉我一个解决方案,如何通过(可能是定制的)JTextArea实现这一点吗? 是否可以覆盖字体图像或类似的内容 在我的另一个视图中,如果我不需要操作文本,我将使用html将这些字符显示为图像(如果您知道更好的解决方案,请告诉

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

在这些文本中,我有两个特殊字符,即STX/ETX(ASCII中的0x02、0x03)。 当我输入这些字符时,它们显示为不可见或其他符号。我想让它们像记事本一样可见和可复制:

有人能告诉我一个解决方案,如何通过(可能是定制的)JTextArea实现这一点吗? 是否可以覆盖字体图像或类似的内容


在我的另一个视图中,如果我不需要操作文本,我将使用html将这些字符显示为图像(如果您知道更好的解决方案,请告诉我)。

我不确定使用JTextArea是否可行,至少在不干扰大量Swing内部结构的情况下是如此。但JTextPane可以做到这一点:

JTextPane textPane = new JTextPane();
Icon stx = new ImageIcon("stx.png");
Icon etx = new ImageIcon("etx.png");

textPane.setText("\u0002Example\u0003");
StyledDocument doc = textPane.getStyledDocument();

MutableAttributeSet attr;

attr = new SimpleAttributeSet();
StyleConstants.setIcon(attr, stx);
doc.setCharacterAttributes(0, 1, attr, false);

attr = new SimpleAttributeSet();
StyleConstants.setIcon(attr, etx);
doc.setCharacterAttributes(8, 1, attr, false);

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

更好的解决方案是在修改过的TrueType字体文件中使用字体图示符。您可以为STX、ETX等绘制一个glyph,并将它们添加到字体文件中,但要复制在Notepadd++中看到的闪烁glyph需要大量的工作

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

  • 下载一个TTF文件,如UbuntuMono-R.TTF,在FontForge中打开该文件,您可以在列表的开头看到所有本机glyph和空控制字符的列表
  • 在FontForge中打开另一个TTF文件,如Digits.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);
    
  • 如果有人找到原始闪烁图示符或自己绘制,将它们添加到FontForge中的列表中,您将在文本组件中看到它们,那么过程将是相同的(我已经测试并逐像素绘制了控制字符EOT,在Swing中还可以,但我太懒了,无法绘制其余部分)


    谢谢。我现在正在为我的两个面板使用JTextPane。我主要使用JTextArea作为我发现的语法突出显示库。