黑马程序员技术交流社区
标题:
java聊天工具!
[打印本页]
作者:
安卓安小虾
时间:
2014-11-9 17:40
标题:
java聊天工具!
/**
* @param args
*/
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class GUI_Chat extends Frame {
private TextField tf;
private Button send;
private Button clear;
private Button log;
private Button shake;
private TextArea sendText;
private TextArea viewText;
private DatagramSocket socket;
private BufferedWriter bw;
/**
* @param args
*/
public GUI_Chat() {
init();
southPanel();
centerPanel();
event();
}
private void event() {
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
try {
socket.close();
bw.close();
} catch (IOException e1) {
e1.printStackTrace();
}
System.exit(0);
}
});
send.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
send();
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
clear.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
viewText.setText("");
}
});
log.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
logFile();
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
shake.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
send(new byte[]{-1},tf.getText());
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
}
private void shake() throws InterruptedException {
int x = this.getLocation().x;
int y = this.getLocation().y;
for(int i = 0; i < 20; i++) {
this.setLocation(x + 20, y + 20);
Thread.sleep(20);
this.setLocation(x - 20, y + 20);
Thread.sleep(20);
this.setLocation(x + 20, y - 20);
Thread.sleep(20);
this.setLocation(x - 20, y - 20);
Thread.sleep(20);
this.setLocation(x, y);
}
}
private void logFile() throws IOException {
bw.flush(); //刷新缓冲区
FileInputStream fis = new FileInputStream("config.txt");//读取配置文件
ByteArrayOutputStream baos = new ByteArrayOutputStream();//创建内存缓冲区
int len;
byte[] arr = new byte[1024]; //创建字节数组
while((len = fis.read(arr)) != -1) { //将文件上的数据读到字节数组中
baos.write(arr, 0, len); //将字节数组中的数据写到内存中
}
viewText.setText(baos.toString()); //转换成字符串
fis.close();
}
private void send(byte[] arr,String ip) throws IOException {
DatagramPacket packet = //创建Packet,相当于集装箱
new DatagramPacket(arr, arr.length, InetAddress.getByName(ip), 8888);
socket.send(packet);
}
private void send() throws IOException {
String message = sendText.getText(); //获取发送区域的文件内容
String ip = tf.getText(); //获取ip地址
send(message.getBytes(),ip); //发送数据
String time = getCurrentTime(); //获取当前时间
String str = time + " 我对" + ip + "说:\r\n" + message + "\r\n\r\n";//alt + shift + l抽取局部变量
viewText.append(str); //将信息添加到显示区域
bw.write(str);
sendText.setText(""); //清空发送区域
}
private String getCurrentTime() {
Date d = new Date(); //创建时间对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");//创建时间格式化对象
return sdf.format(d); //将时间对象格式化
}
private void centerPanel() {
Panel center = new Panel(); //创建中间的Panel
sendText = new TextArea(5,1);
viewText = new TextArea();
center.setLayout(new BorderLayout()); //设置布局管理器
center.add(sendText,BorderLayout.SOUTH); //将发送的文本区域添加到南边
center.add(viewText,BorderLayout.CENTER); //将显示的文本区域添加到中间
viewText.setEditable(false); //将显示的文本区域设置为不可以编辑
//viewText.setBackground(Color.WHITE);
viewText.setBackground(new Color(255,255,255)); //将显示的文本区域背景颜色设置为白色
sendText.setFont(new Font("仿宋", Font.PLAIN, 15));//将发送的文本区域的字体设置为15
viewText.setFont(new Font("仿宋", Font.PLAIN, 15));//将显示的文本区域的字体设置为15
this.add(center,BorderLayout.CENTER); //将Panel添加到Frame的中间
}
private void southPanel() {
Panel south = new Panel(); //创建南边的Panel
tf = new TextField(15);
tf.setText("192.168.12.51");
send = new Button("发 送");
clear = new Button("清 屏");
log = new Button("记 录");
shake = new Button("震 动");
south.add(tf);
south.add(send);
south.add(clear);
south.add(log);
south.add(shake);
this.add(south,BorderLayout.SOUTH); //将Panel添加到Frame的南边
}
private void init() {
this.setSize(400, 600); //设置窗体大小
this.setLocation(500, 50); //设置窗体位置
this.setTitle("GUI聊天室"); //设置窗体标题
new Receive().start();
try {
socket = new DatagramSocket();
bw = new BufferedWriter(new FileWriter("config.txt",true));
} catch (Exception e) {
e.printStackTrace();
}
this.setVisible(true); //设置窗体显示
}
private class Receive extends Thread {
public void run() {
try {
DatagramSocket socket = new DatagramSocket(8888); //创建socket
DatagramPacket packet = new DatagramPacket(new byte[1024 * 8], 8192);//创建packet
while(true) {
socket.receive(packet); //接收
String ip = packet.getAddress().getHostAddress();//获取ip地址
byte[] arr = packet.getData(); //获取数据
int len = packet.getLength(); //获取有效的字节个数
if(arr[0] == -1 && len == 1) { //如果发过来的是-1并且是一个字节
shake(); //震动
continue; //终止本次循环继续下次循环
}
String time = getCurrentTime(); //获取当前时间
String message = new String(arr,0,len); //将获取的有效字节个数转换为字符串
String str = time + " " + ip + " 对我说:\r\n" + message + "\r\n\r\n";
viewText.append(str);//添加到显示区域
bw.write(str);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new GUI_Chat();
}
}
作者:
冥夜
时间:
2014-11-9 17:43
好长- -
作者:
zhangyangLengen
时间:
2014-11-10 12:32
谢谢分享
作者:
炸弹人
时间:
2014-11-11 02:42
好厉害。
作者:
touch_world
时间:
2014-11-11 04:38
为啥都说java的gui很难看?只是觉得java的gui很难操作
作者:
海赛尔
时间:
2014-11-11 09:31
冥夜 发表于 2014-11-9 17:43
好长- -
对 看晕了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2