请问怎样可以做一个能发送表情的聊天程序呢,还有选择表情的框是Pane的话,那每个表情都是一个按钮吗?还有就是怎样设置才能像QQ那样,输出特殊的字符,就直接能显示图片呢?接收的时候,要怎样判断是否是特殊字符,然后把字符变成图片呢
,发送端和接收端该怎样设置这些问题呢?
在下有一段只能发送文字的代码,改了用JTextPane之后不知道为什么不会自动换行,永远只能发一条,只能刷那一条信息:
请各位高手大侠具体的教一教我
服务器端
class ThreadForwenzi extends Thread {
  public ThreadForwenzi() {
 
  // 构造函数,可以用来传递你所需的某些参数,比如窗体对象,然后将其保存至成员变量中
  }
  public void run() { 
  AttributeSet   attrSet1 = null;
  try{
byte buf[]=new byte[1024];
DatagramPacket packet=new DatagramPacket(buf,buf.length);
socket=new MulticastSocket(5555);
while(true){
socket.receive(packet);
String s=new String(buf,0,packet.getLength(),"GBK");
textPane.setText(s);
 dic.insertString(dic.getLength(), "\n"+"\n", (javax.swing.text.AttributeSet) attrSet1);
packet=new DatagramPacket(buf,buf.length);

}

}catch(Exception e){} 
  }
  }
发送端:
JButton button_1 = new JButton("\u53D1\u9001");
button_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
 new ThreadForwenzi().start();
 sendata();
}  public void sendata(){
try{

String msg=textPane_1.getText();
if(msg.equals(""))
return;
textPane.setText("");
String s="127.0.0.1";
InetAddress MyIP=InetAddress.getLocalHost();
String MI=MyIP.getHostAddress();
InetAddress YourIP=InetAddress.getByName(s);
String sj=new String(""+time.get(GregorianCalendar.YEAR)+
             "-"+time.get(GregorianCalendar.MONTH)+
             "-"+time.get(GregorianCalendar.DATE)+
             "-"+time.get(GregorianCalendar.HOUR)+
             ":"+time.get(GregorianCalendar.MINUTE)+
             ":"+time.get(GregorianCalendar.SECOND));
msg="["+MI+"]"+sj+"\n"+msg;

int len=msg.length();
//byte mess[]=new byte[len];
//msg.getBytes(0,len,mess,0);
//msg=new String(packet.getData(),0,packet.getLength(),"GBK");
DatagramPacket packet=new DatagramPacket(msg.getBytes(),msg.getBytes().length,YourIP,5555);
msg=new String(packet.getData(),0,packet.getLength(),"GBK");
socket.send(packet);

}
catch(Exception e1){

}
}
});

解决方案 »

  1.   

    http://topic.csdn.net/u/20120518/13/efd4e454-8ca3-4ec6-af0e-b0e553bb15a6.html?85815在你的隔壁帖子就有啊
      

  2.   

    表情还是图片纯粹点吧,用按钮也可以,但是我觉得没必要,就是图要同样大小(没比较过,看实际使用经验吧)特殊字符显示就是置换,检测到要显示的text中包含特殊字符,就代之以对应的图片显示你那个不会换行是每次都 setText 当前消息了吧?setText不是追加。像你这种情况先找一个例子看会比较好一点
      

  3.   

    谢谢,高手大侠们的提示,我有一个问题想问问
    关于接收端的显示文字的问题,
    按dracularking这个高手大侠所说的,textPane.setText(s+"\n");
    这句话是会覆盖掉之前的信息的,但是textPane没有accept那样方便的自动换行代码
    那我应该怎样去改写,才能做到能每次一接受到新的信息就刷出一条新的信息来显示呢?
    请各位高手大侠,教一教我
    服务器端
    class ThreadForwenzi extends Thread {
    public ThreadForwenzi() {
      
    // 构造函数,可以用来传递你所需的某些参数,比如窗体对象,然后将其保存至成员变量中
    }
    public void run() {  
    AttributeSet attrSet1 = null;
    try{
    byte buf[]=new byte[1024];
    DatagramPacket packet=new DatagramPacket(buf,buf.length);
    socket=new MulticastSocket(5555);
    while(true){
    socket.receive(packet);
    String s=new String(buf,0,packet.getLength(),"GBK");
    dic.insertString(dic.getLength(), s+"\n", (javax.swing.text.AttributeSet) attrSet1);
    packet=new DatagramPacket(buf,buf.length);}}catch(Exception e){}  
    }
    }
      

  4.   

    使用textArea显示信息,用append追加新信息
      

  5.   

    谢谢,可是我必须使用JTextPane来做,因为要显示出图片来
      

  6.   

    这里的显示新消息其实是连同旧消息一并显示,那就得把 旧消息+新消息 一起setText到textPane中你所提到的textPane.setText(s+"\n"); 其中的s是不是没包括你所要显示的旧消息呢?
      

  7.   

    如果你要把当前显示的消息仍旧全部显示的话,用getText()+新消息
    如果是要显示一定条目的话,就要裁剪getText()所获得的string
      

  8.   

    textPane.setText(textPane.getText+s+"\n");
    这样吗,可是我这样写的话,还是只能够发送一条信息,还是说我写错了,请各位高手大侠指教
      

  9.   


    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.SystemColor;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.WindowEvent;
    import java.net.DatagramSocket;
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextPane;
    import javax.swing.UIManager;
    import javax.swing.border.TitledBorder;/**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2006</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */public class MyFrame extends JFrame implements KeyListener, ActionListener
    {
        JPanel contentPane;
        BorderLayout borderLayout1 = new BorderLayout();
        JPanel jPanel1 = new JPanel();
        JPanel jPanel2 = new JPanel();
        BorderLayout borderLayout2 = new BorderLayout();
        JTextPane jTextPane1 = new JTextPane();
        JButton jButton1 = new JButton();
        JTextPane jTextPane2 = new JTextPane();
        TitledBorder titledBorder1;
        TitledBorder titledBorder2;
        JScrollPane jScrollPane1 = new JScrollPane();
        JScrollPane jScrollPane2 = new JScrollPane();
        BorderLayout borderLayout3 = new BorderLayout();
        JTextPane jTextPane3 = new JTextPane();
        JPanel jPanel3 = new JPanel();
        BorderLayout borderLayout4 = new BorderLayout();    BorderLayout borderLayout5 = new BorderLayout();
        JTextPane jTextPane4 = new JTextPane();
        JPanel jPanel4 = new JPanel();    //Construct the frame
        public MyFrame()
        {
            try
            {
                jbInit();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }    //Component initialization
        private void jbInit() throws Exception
        {
            contentPane = (JPanel)this.getContentPane();
            titledBorder1 = new TitledBorder("");
            titledBorder2 = new TitledBorder("");
            contentPane.setLayout(borderLayout1);
            this.setDefaultCloseOperation(HIDE_ON_CLOSE);
            this.setSize(new Dimension(400, 300));
            this.setTitle("E ChaT RooM_Created by dracularking");
            borderLayout1.setVgap(0);
            jPanel1.setBackground(SystemColor.controlLtHighlight);
            jPanel1.setEnabled(true);
            jPanel1.setFont(new java.awt.Font("Dialog", 0, 20));
            jPanel1.setForeground(Color.black);
            jPanel1.setAlignmentY( (float) 0.5);
            jPanel1.setDebugGraphicsOptions(0);
            jPanel1.setDoubleBuffered(true);
            jPanel1.setPreferredSize(new Dimension(120, 22));
            jPanel1.setLayout(borderLayout2);
            jPanel2.setBackground(UIManager.getColor("Button.disabledShadow"));
            jPanel2.setEnabled(true);
            jPanel2.setFont(new java.awt.Font("Dialog", 0, 20));
            jPanel2.setForeground(Color.black);
            jPanel2.setDebugGraphicsOptions(0);
            jPanel2.setDoubleBuffered(true);
            jPanel2.setMaximumSize(new Dimension(32767, 32767));
            jPanel2.setLayout(borderLayout3);        jButton1.setBackground(Color.orange);
            jButton1.setForeground(Color.black);
            jButton1.setAlignmentY( (float) 0.5);
            jButton1.setActionCommand("SENT");
            jButton1.setText("SENT");
            jTextPane2.setBackground(Color.white);
            jTextPane2.setFont(new java.awt.Font("Dialog", 0, 12));
            jTextPane2.setBorder(titledBorder2);
            jTextPane2.setEditable(false);
            jScrollPane1.setHorizontalScrollBarPolicy(JScrollPane.
                                                      HORIZONTAL_SCROLLBAR_AS_NEEDED);
            jTextPane3.setBackground(Color.pink);
            jTextPane3.setFont(new java.awt.Font("Dotum", 0, 12));
            jTextPane3.setBorder(BorderFactory.createLoweredBevelBorder());
            jTextPane3.setCaretPosition(0);
            jTextPane3.setText("Please input Object's IP address here");
            jPanel3.setDebugGraphicsOptions(0);
            jPanel3.setMaximumSize(new Dimension(183, 20));
            jPanel3.setPreferredSize(new Dimension(183, 20));
            jPanel3.setLayout(borderLayout4);
            jTextPane1.setFont(new java.awt.Font("Dialog", 0, 12));
            jTextPane4.setText("Please input your ID here");
            jTextPane4.setCaretPosition(0);
            jTextPane4.setBorder(BorderFactory.createLoweredBevelBorder());
            jTextPane4.setFont(new java.awt.Font("Dotum", 0, 12));
            jTextPane4.setForeground(Color.blue);
            jTextPane4.setBackground(Color.pink);
            jPanel4.setLayout(borderLayout5);
            jPanel4.setPreferredSize(new Dimension(183, 20));
            jPanel4.setMaximumSize(new Dimension(183, 20));
            jPanel4.setDebugGraphicsOptions(0);
            contentPane.add(jPanel1, BorderLayout.EAST);
            jPanel1.add(jButton1, BorderLayout.SOUTH);
            jPanel1.add(jScrollPane1, BorderLayout.CENTER);
            jScrollPane1.getViewport().add(jTextPane1, null);
            contentPane.add(jPanel2, BorderLayout.CENTER);
            jPanel2.add(jScrollPane2, BorderLayout.CENTER);
            jScrollPane2.getViewport().add(jTextPane2, null);
            contentPane.add(jPanel3, BorderLayout.SOUTH);
            jPanel3.add(jTextPane3, BorderLayout.CENTER);
            contentPane.add(jPanel4, BorderLayout.NORTH);        //jTextPane1.addKeyListener(new MyFrame());
            jPanel4.add(jTextPane4, BorderLayout.CENTER);    }    //Overridden so we can exit when window is closed
        protected void processWindowEvent(WindowEvent e)
        {
            super.processWindowEvent(e);
            if (e.getID() == WindowEvent.WINDOW_CLOSING)
            {
                System.exit(0);
            }
        }    public void keyPressed(KeyEvent e)
        {    }    public void keyReleased(KeyEvent e)
        {    }    public void keyTyped(KeyEvent e)
        {
            if (e.isControlDown() && e.getKeyChar() == '\n' &&
                !jTextPane1.getText().equals(""))
            {
                sentData();
            }
        }    public void actionPerformed(ActionEvent e)
        {
            if (!jTextPane1.getText().equals(""))
            {
                sentData();
            }
        }    private void sentData()
        {
            if (jTextPane2.getText().equals(""))
            {
                jTextPane2.setText(jTextPane4.getText()+"\n"+jTextPane1.getText());
                jTextPane1.setText("");
            }
            else
            {
                jTextPane2.setText(jTextPane2.getText() + "\n" +
                                   jTextPane4.getText()+"\n"+jTextPane1.getText());
                jTextPane1.setText("");
            }
        }
        
        public static void main(String[] args) {
         boolean packFrame = false;
        
         MyFrame frame = new MyFrame();
            frame.jTextPane1.addKeyListener(frame);
            frame.jButton1.addActionListener(frame);
            //Validate frames that have preset sizes
            //Pack frames that have useful preferred size info, e.g. from their layout
            if (packFrame)
            {
                frame.pack();
            }
            else
            {
                frame.validate();
            }
            //Center the window
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            Dimension frameSize = frame.getSize();
            if (frameSize.height > screenSize.height)
            {
                frameSize.height = screenSize.height;
            }
            if (frameSize.width > screenSize.width)
            {
                frameSize.width = screenSize.width;
            }
            frame.setLocation( (screenSize.width - frameSize.width) / 2,
                              (screenSize.height - frameSize.height) / 2);
            frame.setVisible(true);
    }}