关于java聊天工具,图形化界面+多线程实现中的问题

qq_21292551 2014-12-05 11:47:42
我开始是分别建立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();
}

}
}

}
...全文
412 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_16432215 2016-06-27
  • 打赏
  • 举报
回复
我记得好像从那个地方看到过,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
云上飞翔 2014-12-05
  • 打赏
  • 举报
回复
引用 楼主 qq_21292551 的回复:
我开始是分别建立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();
}

}
}

}


不明白你问的问题是什么。因为程序是能接收数据的。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧