2014-07-05 53 views
2

我在寫一個由2個面板組成的應用程序。一個用於輸入文本的JTextArea,另一個用於顯示文本。在JTextArea中控制字符的Java圖像

在這些文本中,我有兩個特殊字符,即STX/ETX(0x02,ASCII爲0x03)。 當我輸入這些字符時,它們顯示爲不可見或其他符號。我想使它們可見和可複製像記事本++中: notepad++ special characters example

任何人都可以指向我的解決方案如何實現與(可能是自定義)JTextArea? 是否可以覆蓋字體圖像或類似的東西?

對於我的另一種觀點,我不需要操縱文本,我將把html顯示爲圖像(如果你知道更好的解決方案,請告訴我)。

回答

2

與影像作品更換控制字符,但它似乎佔用CPU資源,使GUI滯後。

更好的解決方案是在修改後的TrueType字體文件中使用字體字形。您可以爲STX,ETX等繪製字形並將它們添加到字體文件中,但重現您在Notepadd ++中看到的Scintilla字形有很多工作要做。

您可以使用另一種簡單的方法:

  1. 下載喜歡UbuntuMono-R.ttf一個TTF文件,打開FontForge文件,你可以看到所有的原生字形的列表,並在空控制字符列表的開始。
  2. 在FontForge中打開另一個類似Digits.ttf的TTF文件,並複製您感興趣的字符並將它們粘貼到列表的開頭。在這裏,我粘貼了代表控制字符十六進制代碼的圓圈數字。
  3. 生成包含控制字符表示的新TTF文件。
  4. Embbed在罐子裏的字體文件,並在您的應用程序進行註冊:

    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中的列表中,並且您將在文本組件中看到它們(我測試並繪製了控制字符EOT像素按照像素http://fontstruct.com,在Swing中是可以的,但我懶得畫剩下的)。

enter image description here

2

我不確定使用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); 
+0

謝謝。我現在正在爲我的兩個面板使用JTextPane。我主要使用JTextArea來查找我找到的語法高亮庫。 – Marco