JTextArea中控制字符的Java图像
我正在写一个由两个面板组成的应用程序。一个JTextArea用于输入文本,另一个用于显示文本 在这些文本中,我有两个特殊字符,即STX/ETX(ASCII中的0x02、0x03)。 当我输入这些字符时,它们显示为不可见或其他符号。我想让它们像记事本一样可见和可复制: 有人能告诉我一个解决方案,如何通过(可能是定制的)JTextArea实现这一点吗? 是否可以覆盖字体图像或类似的内容JTextArea中控制字符的Java图像,java,text,fonts,controls,character,Java,Text,Fonts,Controls,Character,我正在写一个由两个面板组成的应用程序。一个JTextArea用于输入文本,另一个用于显示文本 在这些文本中,我有两个特殊字符,即STX/ETX(ASCII中的0x02、0x03)。 当我输入这些字符时,它们显示为不可见或其他符号。我想让它们像记事本一样可见和可复制: 有人能告诉我一个解决方案,如何通过(可能是定制的)JTextArea实现这一点吗? 是否可以覆盖字体图像或类似的内容 在我的另一个视图中,如果我不需要操作文本,我将使用html将这些字符显示为图像(如果您知道更好的解决方案,请告诉
在我的另一个视图中,如果我不需要操作文本,我将使用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需要大量的工作 您可以使用另一种简单的方法:
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);
}
public static final Font FONT_UBUNTU = new Font("Ubuntu Mono", Font.PLAIN, 12);
谢谢。我现在正在为我的两个面板使用JTextPane。我主要使用JTextArea作为我发现的语法突出显示库。