我开始是分别建立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();
} }
}}

解决方案 »

  1.   

    我记得好像从那个地方看到过,gui的操作智能在awt的线程里面操作的,其他的线程是不能对其进行操作的。也就是说你想要将接收到的数据显示出来,只能在图形化界面的那个线程中执行才是可以的。
          ja.append(new String(dp.getData(), 0, dp.getLength()));
    这句的实现是在你新开的线程里面操作地,
           new Thread(new ReceiveMessage(new DatagramSocket(10000))).start();
    所以是没有使没有办法显示出来的。
    我最近也在写一个同样的代码,也是有点问题,但这个是可以实现的,你可以参考下我写的,http://pan.baidu.com/s/1jIpo6Xo!
    http://ask.csdn.net/questions/265878