关于java聊天工具,图形化界面+多线程实现中的问题
我开始是分别建立send和receive两个实现runnable的类 然后一个图形化界面,让JTextField的gettext()传到send类里面,实习不了,怎么才能让两个线程运行的同时还能在JFrame的图形化界面下实现显示数据,实在想不到 又用内部类的方法,在JFrame 的图形化的实现类里面定义的send和receive的内部类,变量是可以用了,但是居然没显示,贴上代码,麻烦帮我看下,不甚感激啊,谢了啦
package com.likang.cheatall;
import java.awt.Container;
import java.awt.Font;
import java.awt.GraphicsConfiguration;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
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 javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class CheatFrame extends JFrame {
JTextArea ja;
JTextField jt;
JButton jb;
JLabel jl;
CheatFrame() {
this.setTitle("Xx聊天工具");
this.init();
this.setVisible(true);
try {
new Thread(new ReceiveMessage(new DatagramSocket(10000))).start();
} catch (SocketException e) {
throw new RuntimeException("接收出错");
}
}
void init() {
this.setBounds(400, 200, 480, 300);
this.setResizable(false);
Container ca = this.getContentPane();
ja = new JTextArea();
ja.setBounds(0, 0, 480, 200);
ja.setEditable(false);
ja.setOpaque(false);
jt = new JTextField();
jt.setBounds(10, 220, 380, 30);
jt.setOpaque(false);
jl = new JLabel();
jl.setBounds(0, 0, 480, 300);
jl.setIcon(new ImageIcon("src\\com\\likang\\pic\\bg.png"));
jb = new JButton("发送");
jb.setFont(new Font("dialog", 1, 15));
jb.setBounds(400, 220, 70, 30);
jl.add(ja);
jl.add(jt);
jl.add(jb);
ca.add(jl);
setEvent();
}
private void sendBegin() {
try {
new Thread(new SendMessage(new DatagramSocket())).start();
} catch (SocketException e) {
throw new RuntimeException("发送出错");
}
}
private void setEvent() {
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sendBegin();
}
});
}
class SendMessage implements Runnable {
DatagramSocket ds;
public SendMessage(DatagramSocket s) {
this.ds = s;
}
@Override
public void run() {
byte[] bu = jt.getText().getBytes();
DatagramPacket dp = null;
try {
dp = new DatagramPacket(bu, bu.length,
InetAddress.getByName("192.168.1.255"), 10000);
ds.send(dp);
} catch (Exception e) {
throw new RuntimeException("发送错误");
}
ds.close();
}
}
class ReceiveMessage implements Runnable {
DatagramSocket ds;
public ReceiveMessage(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
DatagramPacket dp = null;
try {
while (true) {
byte[] bu = new byte[1024];
dp = new DatagramPacket(bu, 0, bu.length);
ds.receive(dp);
ja.append(new String(dp.getData(), 0, dp.getLength()));
}
} catch (Exception e) {
throw new RuntimeException();
}
}
}
}