2012-12-05 52 views
3

我一直在舉例來說,如果想知道:Java字符串的replaceAll()

JTextPane chatTextArea = new JTextPane(); 
    s.replaceAll(":\\)", emoticon()); 

    public String emoticon(){ 
      chatTextArea.insertIcon(new ImageIcon(ChatFrame.class.getResource("/smile.png"))); 
      return "`"; 
     } 

可以把圖片和 「`」 無處不在 「:)」 中找到。當我像這樣運行時,如果s包含「:)」,那麼整個s就會被圖標替換。 有沒有辦法做到這一點?

+0

不會圖標在文檔的末尾插入? – Mordechai

+0

@Andreas_D怎麼樣'JTextPane'? – Mordechai

+0

@Andreas_D和圖標也是如此。 – Mordechai

回答

3

這裏是一個小例子,我提出(1至@StanislavL原始),只是使用DocumentListener並檢查被輸入爲表情符號的匹配序列時,用適當的圖像替換它:

enter image description here

NB:SPACE必須按下或其它字符/表情符號類型來顯示圖像

import java.awt.Dimension; 
import java.awt.Image; 
import java.net.URL; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextPane; 
import javax.swing.SwingUtilities; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.text.AbstractDocument; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.SimpleAttributeSet; 
import javax.swing.text.StyleConstants; 
import javax.swing.text.StyledDocument; 
import javax.swing.text.Utilities; 

public class JTextPaneWithEmoticon { 

    private JFrame frame; 
    private JTextPane textPane; 
    static ImageIcon smiley, sad; 
    static final String SMILEY_EMOTICON = ":)", SAD_EMOTICON = ":("; 
    String[] emoticons = {SMILEY_EMOTICON, SAD_EMOTICON}; 

    private void initComponents() { 
     frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     textPane = new JTextPane(); 

     //add docuemntlistener to check for emoticon insert i.e :) 
     ((AbstractDocument) textPane.getDocument()).addDocumentListener(new DocumentListener() { 
      @Override 
      public void insertUpdate(final DocumentEvent de) { 
       //We should surround our code with SwingUtilities.invokeLater() because we cannot change document during mutation intercepted in the listener. 
       SwingUtilities.invokeLater(new Runnable() { 
        public void run() { 
         try { 
          StyledDocument doc = (StyledDocument) de.getDocument(); 
          int start = Utilities.getRowStart(textPane, Math.max(0, de.getOffset() - 1)); 
          int end = Utilities.getWordStart(textPane, de.getOffset() + de.getLength()); 

          String text = doc.getText(start, end - start); 

          for (String emoticon : emoticons) {//for each emoticon 

           int i = text.indexOf(emoticon); 
           while (i >= 0) { 
            final SimpleAttributeSet attrs = new SimpleAttributeSet(doc.getCharacterElement(start + i).getAttributes()); 
            if (StyleConstants.getIcon(attrs) == null) { 

             switch (emoticon) {//check which emtoticon picture to apply 
              case SMILEY_EMOTICON: 
               StyleConstants.setIcon(attrs, smiley); 
               break; 
              case SAD_EMOTICON: 
               StyleConstants.setIcon(attrs, sad); 
               break; 
             } 

             doc.remove(start + i, emoticon.length()); 
             doc.insertString(start + i, emoticon, attrs); 
            } 
            i = text.indexOf(emoticon, i + emoticon.length()); 
           } 
          } 
         } catch (BadLocationException ex) { 
          ex.printStackTrace(); 
         } 
        } 
       }); 
      } 

      @Override 
      public void removeUpdate(DocumentEvent e) { 
      } 

      @Override 
      public void changedUpdate(DocumentEvent e) { 
      } 
     }); 

     JScrollPane scrollPane = new JScrollPane(textPane); 
     scrollPane.setPreferredSize(new Dimension(300, 300)); 

     frame.add(scrollPane); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 

     try {//attempt to get icon for emoticons 
      smiley = new ImageIcon(ImageIO.read(new URL("http://facelets.com/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/e/m/emoticons0001.png")).getScaledInstance(24, 24, Image.SCALE_SMOOTH)); 
      sad = new ImageIcon(ImageIO.read(new URL("http://zambia.primaryblogger.co.uk/files/2012/04/sad.jpg")).getScaledInstance(24, 24, Image.SCALE_SMOOTH)); 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new JTextPaneWithEmoticon().initComponents(); 
      } 
     }); 
    } 
} 

再ferences:

+0

除了當用戶輸入例如:) :)時,您的示例運行良好,然後它只顯示一個笑臉。我該如何解決它? – vejmartin

+0

@JohnWitsen我製作的表情立即出現,因爲輸入的內容會出現問題,請查看更新對不起 –

+0

太棒了!非常感謝! – vejmartin