Olá a todos, eu já pesquisei muito a respeito, e sei que tem tópicos parecidos com minha dúvida, porem não consegui de jeito nenhum resolver isto! Em meio a essas várias pesquisas que fiz consegui montar um ouvinte para o JTextPane do meu chat socket, esse ouvinte tem um HashTable de caracters emojis, e também uma estrutura que analisa o que foi inserido no JTextPane, tenho uma imagem chamada “smile.png” guarada em um packager chamado “emoticons”, preciso que quando o usuário digitar “:)” ou qualquer outro emoji da HashTable, essa string seja substituida pela imagem correspondente (ainda tenho que colocar mais emojis na pasta), a única forma que deu certo uma vez foi com um código que analisa somente a string “:)” e substitui por uma imageicon desenhada no próprio código usando paintComponete do Graphics2D, e isso não é o ideal pra mim (até por que não sei desenhar emoji nenhum por esse método).
O código:
obs: o nome do meu JTextPane é “textPane”.
public void append(String s) {
try {
Document doc = textPane.getDocument();
Style style = textPane.addStyle("Style", null);
if (s.equals("Menssage privada para: " + msg.getNomeReservado() + "\n")) {
StyleConstants.setForeground(style, Color.RED);
} else if (s.equals("Fim da menssagem privada.\n")) {
StyleConstants.setForeground(style, Color.RED);
} else if (s.equals("Menssagem privada de " + nome + ":\n")) {
StyleConstants.setForeground(style, Color.RED);
}
int offset = doc.getLength();
doc.insertString(doc.getLength(), s, style);
java.util.Hashtable emoticons = new java.util.Hashtable();
emoticons.put(":P", "belat");
emoticons.put(":D", "biggrin");
emoticons.put(":}", "blush");
emoticons.put(":$", "confused");
emoticons.put("B)", "cool");
emoticons.put(":'(", "cry");
emoticons.put(":O", "eek");
emoticons.put(":(", "frown");
emoticons.put("%)", "funky");
emoticons.put(">|", "mad");
emoticons.put(":|", "muted");
emoticons.put(":/", "sarcastic");
emoticons.put(":)", "smile");
emoticons.put(";)", "wink");
for (java.util.Enumeration e=emoticons.keys(); e.hasMoreElements();)
{
String symbol = e.nextElement().toString();
String icon = emoticons.get(symbol).toString();
while (true){
s= doc.getText(offset, s.length());
int pos = s.indexOf(symbol);
if (pos < 0)
break;
StyleConstants.setIcon(style, new ImageIcon("file:///C:/Users/Matheus/eclipse-workspace/aps5pCliente/src/com/aps/app/emoticons/"+icon+".png"));
doc.insertString(offset + pos, ".", style);
doc.remove(offset + pos + 1, symbol.length());
}
}
/* textPane.setText("<IMG SRC="+
"\"file:///C:/Users/Matheus/eclipse-workspace/aps5pCliente/src/com/aps/app/emoticons/smile.png\""+
"WIDTH=\"20\" HEIGHT=\"20\"> ");*/
this.textPane.setCaretPosition(doc.getLength());
}catch(BadLocationException exc){
exc.printStackTrace();
}
}
Porém, quando eu digito “:)” a string é apagada mas a imagem não é inserida, apenas fica vazio onde deveria ter uma imagem!
Alguém sabe como resolver isso, ou alguma outra técnica de se fazer essa troca? Agradeço a atenção desde já!