Fórum Sistema de emoji semelhante com o da Twitch - chat socket Java #592828
29/04/2018
0
Olá, estou desenvolvendo um chat socket em java para um trabalho da faculdade. O meu problema é até um pouco difícil de esplicar. Bem, eu tenho um hashTable de emojis, onde tenho dados do tipo: emoticon.put(":)","smile"), assim como tenho uma pasta cheia de imagens de emojis, tenho um método que substitui qualquer caractere que seja igual a alguma chave do hashTable pela imagem do emoji correspondente na pasta, eu também criei um combo box que recebe todos esses emojis da pasta e guarda seus ImageIcon's em seus indexes. Porém, eu preciso que quando o usuário clicasse em algum desses emojis do comboBox, a chave dele da hashTable fosse setada no meu textArea de digitar, igual ao que acontece no chat da Twitch.tv! Eu realmente não faço idéia de como resolver essa questão, nem por onde começar! eis meu código:
//meu método de hash de emojis:
//meu ouvinte para subistituir as chaves dos emojis pelas imagens da pasta:
//o reader do comboBox:
//o código no construtor da classe que busca e envia a imagem para o comboBox:
Eu realmente não faço a mínima idéia de como posso fazer isso, Alguém tem alguma idéia de como isso pode ser feito? Agradeço desde já atênção.
//meu método de hash de emojis:
private Hashtable<String, String> Emoticon() {
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(">(", "angry");
emoticons.put(">|", "mad");
emoticons.put(":.", "muted");
emoticons.put(":|", "neutral");
emoticons.put("¬¬", "sarcastic");
emoticons.put(":)", "smile");
emoticons.put(";)", "wink");
emoticons.put(":3", "kiss");
emoticons.put(";D", "rolling");
return emoticons;
}
//meu ouvinte para subistituir as chaves dos emojis pelas imagens da pasta:
private void initListener() {
textPane.getDocument().addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent event) {
final DocumentEvent e = event;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
if (e.getDocument() instanceof StyledDocument) {
try {
StyledDocument doc = (StyledDocument) e.getDocument();
int start = Utilities.getRowStart(textPane, Math.max(0, e.getOffset() - 1));
int end = Utilities.getWordStart(textPane, e.getOffset() + e.getLength());
String text = doc.getText(start, end - start);
for (Enumeration<String> e = Emoticon().keys(); e.hasMoreElements();) {
symbol = e.nextElement().toString();
icon = Emoticon().get(symbol).toString();
int i = text.indexOf(symbol);
String diretorio = "/com/aps/app/emoji/" + icon + ".png";
resource = getClass().getResource(diretorio);
ImageIcon img = new ImageIcon(resource);
Image image = img.getImage().getScaledInstance(18, 18, java.awt.Image.SCALE_SMOOTH);
while (i >= 0) {
final SimpleAttributeSet attrs = new SimpleAttributeSet(
doc.getCharacterElement(start + i).getAttributes());
if (StyleConstants.getIcon(attrs) == null) {
StyleConstants.setIcon(attrs, new ImageIcon(image));
doc.remove(start + i, 2);
doc.insertString(start + i, symbol, attrs);
}
i = text.indexOf(symbol, i + 2);
}
}
} catch (BadLocationException e1) {
e1.printStackTrace();
}
}
}
});
}
public void removeUpdate(DocumentEvent e) {
}
public void changedUpdate(DocumentEvent e) {
}
});
}
//o reader do comboBox:
class ComboBoxRenderer extends JLabel implements ListCellRenderer {
private Font uhOhFont;
public ComboBoxRenderer() {
setOpaque(true);
setHorizontalAlignment(CENTER);
setVerticalAlignment(CENTER);
}
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
boolean cellHasFocus) {
int selectedIndex = ((Integer) value).intValue();
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
ImageIcon icon = images[selectedIndex];
pet = emojis[selectedIndex];
setIcon(icon);
if(icon == null) {
setUhOhText(pet + " (Perdido!)",
list.getFont());
}
return this;
}
protected void setUhOhText(String uhOhText, Font normalFont) {
if (uhOhFont == null) {
uhOhFont = normalFont.deriveFont(Font.ITALIC);
}
setFont(uhOhFont);
setText(uhOhText);
}
}
//o código no construtor da classe que busca e envia a imagem para o comboBox:
images = new ImageIcon[emojis.length];
Integer[] intArray = new Integer[emojis.length];
for (int i2 = 0; i2 < emojis.length; i2++) {
intArray[i2] = new Integer(i2);
String diretorio = "/com/aps/app/emoji/" + emojis[i2] + ".png";
resource = getClass().getResource(diretorio);
ImageIcon img = new ImageIcon(resource);
Image image = img.getImage().getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH);
images[i2] = new ImageIcon(image);
}
JComboBox jComboBox = new JComboBox(intArray);
comboBox = jComboBox;
comboBox.setBounds(5, 216, 59, 22);
contentPane.add(comboBox);
ComboBoxRenderer renderer = new ComboBoxRenderer();
renderer.setPreferredSize(new Dimension(40, 40));
comboBox.setRenderer(renderer);
comboBox.setMaximumRowCount(3);
Eu realmente não faço a mínima idéia de como posso fazer isso, Alguém tem alguma idéia de como isso pode ser feito? Agradeço desde já atênção.
Creepcod
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)