这两天断断续续把仿QQ通信系统完善,在没有一点基础的情况下完成图片的发送,还是很受鼓舞的。下面是一些具体细节和实现:
首先,我们在窗体上添加一个“图片”按钮,然后添加一个监听器,当我们点击这个按钮时,弹出图片选择器,我的图片选择器是用JList实现的,我们可以再新建一个窗体,将JList添加到窗体上,JList里面添加图片元素就完成了第一步。
代码实现:
// 列表模型,添加元素
DefaultListModel listModel = new DefaultListModel();
ImageIcon icon1 = new ImageIcon("images/发火.png");
ImageIcon icon2 = new ImageIcon("images/哭泣.png");
ImageIcon icon3 = new ImageIcon("images/我晕.png");
ImageIcon icon4 = new ImageIcon("images/2008328111941.png");
ImageIcon icon5 = new ImageIcon("images/2008328111958.png");
ImageIcon icon6 = new ImageIcon("images/200832811204.png");
ImageIcon icon7 = new ImageIcon("images/200832811209.png");
listModel.addElement(icon1);
listModel.addElement(icon2);
listModel.addElement(icon3);
listModel.addElement(icon4);
listModel.addElement(icon5);
listModel.addElement(icon6);
listModel.addElement(icon7);
// 根据模型实例化JList
final JList pictureList = new JList(listModel);
// 设置JList单选属性
pictureList
.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
// 元素水平显示
pictureList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
// 元素自动换行
pictureList.setVisibleRowCount(-1);
// JList是轻量级组件,要把它添加到窗体上
final JFrame jf1 = new JFrame();
jf1.setLocationRelativeTo(null);
jf1.setSize(96 * 4 + 30, 192 + 50);
jf1.getContentPane().add(pictureList);
jf1.setUndecorated(true);// 去边框,调用方法就行了
jf1.setVisible(true);
pictureList.setBounds(0, 0, 96 * 4 + 20, 192 + 50);
JList(ListModel dataModel) 根据指定的 非 null 模型构造一个显示元素的 JList 。 |
JList(Object[] listData) 构造一个 JList ,使其显示指定数组中的元素。 |
以上为JList常用的两种构造方法,我用的是模型参数,这样便于扩展。
当然,会发现点击JList的元素后没有反应,因为我们没有给它添加事件监听,我们可以添加双击事件,单击事件等,切莫认为JList有默认的事件监听。
以下为一些零散的知识点,但是零散就是精华啊:
1.要把一个窗体关闭,我们用dispose(),而不是用setVisible(false)。
2.JList里的元素是有顺序的,我们可以用getSelectedIndex()得到选中元素的索引(从0开始)。
3.要得到JList里面的对象,可以用getSelectedValue()方法。
至此,JList已经完成,但是图片发送怎么搞呢?
首先,我们用JTextPane来接收图片(JTextArea为纯文本编辑,不可插入图片),JTextPane可以编辑文字,插入图片,设置文字格式等,功能比JTextArea强大。
然后,JTextPane里面有insertICon(Icon icon)的方法可以插入图片。
在JTextPane中添加文字,我用的是StyledDocument类,这个类可以从JTextPane的getStyledDocument()获得,是用来编辑文字和设置文字格式的。
这里有一点是要注意的,就是插入光标的位置,有一个方法可以让光标移到JTextpane末尾,setCaretPosition(length);那时候图片插入的位置总是东插一个,西插一个,有了这个方法后,这个问题就解决了。
都知道,到现在我们还没有实现在两个客户端之间发送表情。
我用的是类似腾讯的表情发送方法:
如果大家留心,会发现别人发来的表情会存到你的硬盘的一个地方(具体自己找找),然后再取出图片文件发送到你的聊天窗口上,就是这个流程,思路有了,细节就的自己实现了,将聊天系统的文件发送功能的代码稍微改一下就行了……