请问怎样可以做一个能发送表情的聊天程序呢,还有选择表情的框是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){
}
}
});
,发送端和接收端该怎样设置这些问题呢?
在下有一段只能发送文字的代码,改了用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){
}
}
});
关于接收端的显示文字的问题,
按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){}
}
}
如果是要显示一定条目的话,就要裁剪getText()所获得的string
这样吗,可是我这样写的话,还是只能够发送一条信息,还是说我写错了,请各位高手大侠指教
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);
}}