Dhe*_*yay 8 java unicode jar emoji
我正在开发J2SE中的聊天应用程序,它也可以向其他用户发送表情符号.
应用程序使用https://github.com/vdurmont/emoji-java(Vdurmont Emoji-java-2.1 jar),
我跟着该链路上任何一个所描述的所有的事情,所有正在运行的开发环境中正常,但当我做罐子一样的,当我发送表情符号在网络上的其他用户的,则显示的代码(ðŸ~¡和?).
首先,我认为这是一个从文件夹加载文件的问题,所以使用ClassLoader,以获得正确的图像,但在创建jar时它显示?(问号),所以我删除了该代码,以便更好地理解你.
代码如下:
public ChatUI() {
initComponents();
this.setLayout(new WrapLayout(FlowLayout.LEFT, 5, 5));
for (int i = 0; i < imageHexaCode.length; i++)
{
final javax.swing.JLabel imogis = new javax.swing.JLabel("&#x" + imageHexaCode[i] + ";");
imogis.setCursor(new Cursor(Cursor.HAND_CURSOR));
imogis.setIcon(new javax.swing.ImageIcon(getClass().getResource("emoji_" + imageHexaCode[i] + ".png")));
imogis.setHorizontalTextPosition(JLabel.CENTER);
imogis.setVerticalTextPosition(JLabel.BOTTOM);
imogis.setFont(new Font(null, Font.PLAIN, 1));
imogis.setForeground(Color.white);
final int aa = i;
imogis.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
JLabel jl = new JLabel("&#x" + imageHexaCode[aa] + ";");
jl.setName("&#x" + imageHexaCode[aa] + ";");
jl.setFont(new Font(null, Font.PLAIN, 1));
jl.setHorizontalTextPosition(JLabel.CENTER);
jl.setVerticalTextPosition(JLabel.BOTTOM);
jl.setIcon(new javax.swing.ImageIcon(getClass().getResource("emoji_" + imageHexaCode[aa] + ".png")));
jl.setForeground(Color.white);
ChatPaneWrite.jtp.insertComponent(jl);
System.out.println("" + imogis.getText());
// you can open a new frame here as
// i have assumed you have declared "frame" as instance variable
}
});
this.add(imogis);
}
this.revalidate();
this.repaint();
}
Run Code Online (Sandbox Code Playgroud)
其中imageHexaCode是一系列表情符号的数组.
static String[] imageHexaCode = {
"1f621",
"1f608",
"2764",
"1f494"
};
Run Code Online (Sandbox Code Playgroud)
&jtp是JTextPane,用户点击标签时插入表情符号组件
ChatPaneWrite.jtp.insertComponent(jl);
Run Code Online (Sandbox Code Playgroud)
表情符号存储在我写的同一个包中,这就是我没有使用ClassLoader的原因
jl.setIcon(new javax.swing.ImageIcon(getClass().getResource("emoji_" + imageHexaCode[aa] + ".png")));
Run Code Online (Sandbox Code Playgroud)
或者它也可以像包ChatUI一样写
jl.setIcon(new javax.swing.ImageIcon(getClass().ClassLoader.getResource("ChatUI/emoji_" + imageHexaCode[aa] + ".png")));
Run Code Online (Sandbox Code Playgroud)
这是快照:
在接收端的罐子里显示这样的表情符号
请帮我解决一下.
非常感谢所有人提前
第一步是检查图像资源在运行时是否确实存在。例如,添加一些值的记录getClass().getResource("emoji_" + imageHexaCode[aa] + ".png")以确保它不是null。在您的开发环境中,这些可能是可用的,但由于您构建生产版本的方式,它们可能会以某种方式丢失或放入错误的目录中。
但是,如果您不介意,我还想建议一种替代方法:您是否考虑过将表情符号构建为字体,然后随应用程序一起提供字体文件,而不是使用标签和图像图标?这将有几个显着的优点:
您不需要对表情符号进行任何特殊处理:只需将 unicode 文本放入使用自定义字体的组件中,表情符号以及所有其他文本即可正常工作。
字体图像可以是矢量图像,这意味着它们可以随着用户更改字体大小/缩放级别等而很好地缩放。
用户可以剪切/复制/粘贴包含表情符号的文本;因为它是文本,所以它会再次“正常工作”。
如果您决定走这条路,我之前使用过一个优秀的开源字体编辑器 FontForge: https: //fontforge.github.io/en-US/。这非常简单:您只需在适合字符代码的插槽中设计图像,然后导出字体文件。