package com.gb.chat;
/**
* @(#)ChatFrame.java
*
* JFC Chat application
*
* @author
* @version 1.00 2007/1/8
*/
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
public class ChatFrame extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* The constructor
*/
JList tfList;
JList tfListSend;
// JLabel reLabel = new JLabel("KO");
JLabel reLabel = new JLabel(new ImageIcon(getImage("image/dsz.gif")));
// JLabel sendLabel = new JLabel("发送消息");
JTextField tfData = new JTextField(32);
JTextField tfIp = new JTextField(12);
DefaultListModel dm = new DefaultListModel();
DefaultListModel dms = new DefaultListModel();
DatagramSocket ds, dsState;
int num = 0, num1 = 0;
boolean state = false, yes = true;
String str = null, ip = null;
public ChatFrame() {
/*
* JMenuBar menuBar = new JMenuBar(); JMenu menuFile = new JMenu();
* JMenuItem menuFileExit = new JMenuItem();
*
* menuFile.setText("File"); menuFileExit.setText("Exit"); // Add action
* listener.for the menu button menuFileExit.addActionListener ( new
* ActionListener() { public void actionPerformed(ActionEvent e) {
* ChatFrame.this.windowClosed(); } } ); menuFile.add(menuFileExit);
* menuBar.add(menuFile);
*/
setTitle("Hello mm");
setIconImage(getImage("image/lg.gif"));
// setJMenuBar(menuBar);
setSize(new Dimension(340, 400));
this.setResizable(false);
try {
ds = new DatagramSocket(3000);
dsState = new DatagramSocket(3001);
} catch (Exception e) {
e.printStackTrace();
}
// Add window listener.
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
ChatFrame.this.windowClosed();
}
});
// 设置ip和消息输入栏的字体和字体颜色
Font font = new Font("黑体", Font.PLAIN, 13);
tfData.setFont(font);
tfData.setForeground(Color.BLUE);
tfData.setMinimumSize(new Dimension(80, 300));
tfIp.setFont(new Font("宋体", Font.ITALIC, 13));
tfIp.setForeground(Color.BLUE);
// reLabel.setForeground(Color.RED);
// reLabel.setFont(new Font("黑体", Font.BOLD, 16));
reLabel.setVisible(state);
//
tfList = new JList(dm);
tfList.setFont(font);
tfList.setForeground(Color.BLUE);
JScrollPane js = new JScrollPane();
js.getViewport().add(tfList);
tfListSend = new JList(dms);
tfListSend.setFont(new Font("黑体", Font.ITALIC, 13));
tfListSend.setForeground(new Color(10, 10, 200));
JScrollPane jsSend = new JScrollPane();
jsSend.getViewport().add(tfListSend);
Box jpList = new Box(BoxLayout.Y_AXIS);
jpList.add(js);
jpList.add(jsSend);
JPanel jp = new JPanel();
// jp.setMinimumSize(new Dimension(500,40));
jp.setLayout(new BorderLayout());
jp.add(tfIp, BorderLayout.WEST);
jp.add(reLabel, BorderLayout.CENTER);
jp.add(tfData, BorderLayout.EAST);
Container contentPane = this.getContentPane();
contentPane.add(jpList, BorderLayout.CENTER);
contentPane.add(jp, BorderLayout.SOUTH);
final SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss:SSS");
final Thread t = new Thread(new Runnable() {
int errtimes = 0;
byte[] buf = null;
DatagramPacket dpr = null;
public void run() {
while (yes) {
try {
DatagramPacket dp = new DatagramPacket("OK".getBytes(),
"OK".getBytes().length, InetAddress
.getByName(ip), 3001);
dsState.send(dp);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
state();
// System.out.printf("Start:" + new Date());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// System.out.printf("end:" + new Date());
}
}
private void state() {
try {
buf = new byte[20];
dpr = new DatagramPacket(buf, 20);
dsState.setSoTimeout(5000);
dsState.receive(dpr);
} catch (SocketTimeoutException e) {
// System.out.printf("超时了");
return;
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
//e.printStackTrace();
} finally {
if ("OK".equals(new String(buf, 0, dpr.getLength()))) {
state = true;
errtimes = 0;
} else if (errtimes >= 1) {
state = false;
errtimes = 0;
} else {
errtimes++;
}
setTitle("Hello mm");
reLabel.setVisible(state);
// System.out.printf("还是改了状态" +(new String(buf, 0,
// dpr.getLength()))+"ip:"+ip);
}
}
});
tfIp.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ip = tfIp.getText();
tfData.requestFocusInWindow();
if (!t.isAlive()) {
t.start();
// System.out.print("重启线程名:" + t.getName());
}
}
}
);
//
new Thread(new Runnable() {
String receStr = null;
public void run() {
while (yes) {
try {
byte[] buf = new byte[1024];
DatagramPacket dpr = new DatagramPacket(buf, 1024);
ds.receive(dpr);
receStr = new String(buf, 0, dpr.getLength());
if ("Inputing".equals(receStr.trim()))
{
setTitle("Helle mm. 正在输入........");
}else if("Stopping".equals(receStr.trim())) {
setTitle("Helle mm");
}else{
setTitle("Helle mm");
dm.add(0, (receStr));
dm.add(0, sdf.format(new Date()));
}
// System.out.print("W="+tfData.getWidth()+"
// H="+tfData.getHeight());
} catch (Exception ex) {
//ex.printStackTrace();
}
}
}
}
).start();
// 输入状态发送
tfData.getDocument().addDocumentListener(
new javax.swing.event.DocumentListener() {
public void changedUpdate(DocumentEvent documentEvent) {
//System.out.println("update");
}
public void insertUpdate(DocumentEvent documentEvent) {
setInputState("Inputing");
//System.out.println("input");
}
public void removeUpdate(DocumentEvent documentEvent) {
setInputState("Inputing");
//System.out.println("removeUpdate");
}
});
tfData.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
num++;
str = (new Integer(num)).toString() + ")."
+ tfData.getText();
DatagramPacket dp = new DatagramPacket(str.getBytes(), str
.getBytes().length, InetAddress.getByName(tfIp
.getText()), 3000);
ds.send(dp);
dms.add(0, str);
dms.add(0, sdf.format(new Date()));
tfData.setText("");
setInputState("Stopping");
// System.out.print
评论0