pclass WindowUser extends JFrame implements TreeSelectionListener {
JTree tree;
DefaultMutableTreeNode root, node1, node2; public WindowUser() {
root = new DefaultMutableTreeNode("好友列表");
node1 = new DefaultMutableTreeNode("bbb");
node2 = new DefaultMutableTreeNode("ccc");
tree = new JTree(root);
root.add(node1);
root.add(node2);
tree.addTreeSelectionListener(this);
this.add(new JScrollPane(tree));
this.setBounds(100, 100, 200, 400);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
} @Override
public void valueChanged(TreeSelectionEvent e) {
DefaultMutableTreeNode friend = (DefaultMutableTreeNode) tree
.getLastSelectedPathComponent();
if (friend.isLeaf()) {
QQ qq = new QQ(userPort, port2, userName,name,number);
//QQ是我另外建的一个类,在这里就是弹出一个新建的QQ窗口,代码已经写好。
//程序运行之后,QQ的窗口弹出来了,但是里面的组件不显示,而且窗口还不能关闭,程序好像死在那里了,只能强行终止。改变窗口的大小和位置仍然不管用。
//请高手指教,你们认为是哪里的问题呢?
//this.dispose();
}
}
}
窗口弹出来了,但是里面的组件不显示,而且窗口还不能关闭,程序好像死在那里。
JTree tree;
DefaultMutableTreeNode root, node1, node2; public WindowUser() {
root = new DefaultMutableTreeNode("好友列表");
node1 = new DefaultMutableTreeNode("bbb");
node2 = new DefaultMutableTreeNode("ccc");
tree = new JTree(root);
root.add(node1);
root.add(node2);
tree.addTreeSelectionListener(this);
this.add(new JScrollPane(tree));
this.setBounds(100, 100, 200, 400);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
} @Override
public void valueChanged(TreeSelectionEvent e) {
DefaultMutableTreeNode friend = (DefaultMutableTreeNode) tree
.getLastSelectedPathComponent();
if (friend.isLeaf()) {
QQ qq = new QQ(userPort, port2, userName,name,number);
//QQ是我另外建的一个类,在这里就是弹出一个新建的QQ窗口,代码已经写好。
//程序运行之后,QQ的窗口弹出来了,但是里面的组件不显示,而且窗口还不能关闭,程序好像死在那里了,只能强行终止。改变窗口的大小和位置仍然不管用。
//请高手指教,你们认为是哪里的问题呢?
//this.dispose();
}
}
}
窗口弹出来了,但是里面的组件不显示,而且窗口还不能关闭,程序好像死在那里。
QQ(int i, int j,String s,String name2,String number2) {//name2是对方的名字
server = new Server(i);
client = new Client(j);
client.go();
server.setJTextArea(client.show);//把client中的show作为参数传给server
title="与"+name2+"("+number2+")聊天";
client.win.setTitle(title);
server.go();
}class Client {
int port;
JButton connection, send, record;
JTextArea show;
JTextArea input;
JDialog record1;
Socket socket;
DataInputStream in;
DataOutputStream out;
Thread thread;
String TimeFormat = "y年M月d日 H:m:s ";
FileReader fileReader;
FileWriter fileWriter;
BufferedWriter writeOut;
BufferedReader readIn;
File recordFile;
WindowQQ win;
Client(int i) {
port = i;
} public void go() {
System.out.println("建立对话框");
win = new WindowQQ();
System.out.println("建立对话框");
win.validate();
} class WindowQQ extends JFrame implements ActionListener, Runnable { public WindowQQ() {
this.setLayout(new FlowLayout());
socket = new Socket();
connection = new JButton("连接服务器");
record = new JButton("聊天记录");
send = new JButton("发送");
send.setEnabled(false);
input = new JTextArea(4, 20);
input.setLineWrap(true);
show = new JTextArea(10, 30);
show.setEditable(false);
show.setLineWrap(true);
send.addActionListener(this);
record.addActionListener(this);
connection.addActionListener(this);
JPanel panel = new JPanel();
panel.add(new JLabel("输入:"));
panel.add(input);
panel.add(send);
record1 = new JDialog(this, "聊天记录"); this.add(connection);
this.add(record);
this.add(new JScrollPane(show));
this.add(panel);
this.setBounds(400, 100, 400, 400);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
thread = new Thread(this);
} @Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == connection) {
try {
if (socket.isConnected()) {
} else {
InetAddress address = InetAddress
.getByName("127.0.0.1");
InetSocketAddress socktAddress = new InetSocketAddress(
address, port);
socket.connect(socktAddress);
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
send.setEnabled(true);
if (!(thread.isAlive()))
thread = new Thread(this);
thread.start();
}
} catch (IOException ee) {
System.out.println(ee);
socket = new Socket();
}
} else if (e.getSource() == send) {
String s = input.getText();
try {
writeOut = new BufferedWriter(fileWriter);
out.writeUTF(s);
SimpleDateFormat matter = new SimpleDateFormat(TimeFormat);// 加上时间
show.append(matter.format(new Date()) + "我说:" + s + "\n");// 把我发的消息显示到框中
writeOut
.write(matter.format(new Date()) + "我说:" + s + "\n");
writeOut.newLine();
writeOut.close();
fileWriter.close();
input.setText(null);
} catch (IOException e1) {
} }
}
} public void run() {
}
}
}class Server {
ServerSocket server = null;
ServerThread thread;
Socket you = null;
int port;
JTextArea show;
FileWriter fileWriter;
BufferedWriter writeOut;
File record; public Server(int i) { // 构造函数
this.port = i;
}
void setJTextArea(JTextArea area){//为把server收到的消息显示到client的显示文本区,把文本框赋过来
show=area;
}
public void go() { // 服务器程序运行
while (true) {
try {
server = new ServerSocket(port);
System.out.println("建立套接字");
} catch (IOException e1) {
System.out.println("正在监听");
} try {
System.out.println("等待客户呼叫……");
you = server.accept();
System.out.println("客户的地址:" + you.getInetAddress());
} catch (IOException e) {
System.out.println("正在等待客户呼叫");
} if (you != null) {
System.out.println("服务器线程建立");
new ServerThread(you).start();
}
}
}
class ServerThread extends Thread {
Socket socket;
DataInputStream in;
DataOutputStream out;
String s;
String TimeFormat="y年M月d日 H:m:s "; ServerThread(Socket t) {
socket = t;
try {
out = new DataOutputStream(socket.getOutputStream());
in = new DataInputStream(socket.getInputStream());
} catch (IOException e) {}
} public void run() {
while (true) {
try {
String s = in.readUTF();
SimpleDateFormat matter=new SimpleDateFormat(TimeFormat);//加上时间
System.out.println(matter.format(new Date())+s);
// out.writeUTF(matter.format(new Date())+"你刚才发送的消息:" + s);
show.append(matter.format(new Date())+"对方说:"+s+"\n");//把收到的话显示到框中
fileWriter=new FileWriter(record,true);//把收到的消息存到文件中去
writeOut=new BufferedWriter(fileWriter);
writeOut.write(matter.format(new Date())+"对方说:"+s+"\n");
writeOut.newLine();
writeOut.close();
fileWriter.close();
} catch (IOException e) {
System.out.println("客户离开");
return;
}
}
}
}
}
swing 组件必须要添加到 内容面板中()才可以的,不能直接添加到顶级容器中。 Awt组件可以直接添加到顶级容器(Frame)中
使用Swing的基本规则 :1、Swing的基本组件要布局在内容面板中,而不能直接放在顶级容器中。2、 Swing的内容面板要添加到Swing的顶层容器中才能显示,通过setContentPane (container)等方法来实现。3、每个GUI组件只能被容纳一次。4、避免使用非Swing的重量级组件。
谢谢您的回答,可是我这里面既有Swing,也有awt,我用的时候根本就没在意它是swing还是awt。
我单独运行Client类的时候,窗口里的组件都可以正常显示出来的,这里一调用就显示不出来了。
设置了啊,这个是不会忘的。
QQ窗口已经弹出了,只是里面是空的,组件都没有显示
我单独测试QQ类的时候,运行得没有问题,在这里通过点击JTree叶节点来开启QQ窗口就出现问题了
我还是没有找出问题所在
server = new Server(i);
client = new Client(j);
client.go();
server.setJTextArea(client.show);//把client中的show作为参数传给server
title="与"+name2+"("+number2+")聊天";
client.win.setTitle(title);
server.go();
}
===========================================================
仔细看了一下,感觉你的思路有些问题。
首先,你做的的CS架构的程序,Client和server应该是两个单独的进程,他们将来时要运行在不同的PC上实现TCP通信,所以必须分开。其次 server.go()这个方法里面有个死循环,是用来连续侦听客户端的连接的,如果和client运行在一个进程中,请问如何通信???这里有个简单的例子,或许对你有用Client
package frame;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;
import javax.swing.border.LineBorder;import sun.java2d.pipe.BufferedTextPipe;
public class ClientFrame implements ActionListener,KeyListener
{
JFrame f;
JPanel root ,top ,down;
JTextArea area,chatms;
JLabel tubiao;
Socket socket;
public ClientFrame()
{
initFrame();
try {
socket=new Socket("localhost",9000);
InputStream inputStream = socket.getInputStream();
BufferedReader bd=new BufferedReader(new InputStreamReader(inputStream));
while(true)
{
String string= bd.readLine();
chatms.append("\n 服务器"+gettime()+"说: "+string);
}
} catch ( Exception e) {
e.printStackTrace();
}
} public String gettime(){
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format( new Date());
}
public void initFrame()
{
f=new JFrame( "与服务器聊天中...");
f.setIconImage(Toolkit.getDefaultToolkit().getImage("imges/tb.jpg"));
f.setResizable(false);
f.setBounds(200,100,400,400);
//自定义根面板
root=new JPanel();
root.setLayout(new BorderLayout());
top=new JPanel(new BorderLayout( 5,15));
chatms=new JTextArea ();
chatms.setFont( Font.decode(" 黑体_GB2312-BOLD-13" ));
chatms.setBorder(new LineBorder(Color.blue));
chatms.setText ("\n ok");
chatms.setEditable(false);
chatms.setLineWrap(true);
chatms.setWrapStyleWord(true);
area =new JTextArea (4,20);
area.setFont( Font.decode(" 黑体_GB2312-BOLD-15" ));
area.setLineWrap(true);
area.setWrapStyleWord(true);
area.setBorder(new LineBorder(Color.blue));
area.addKeyListener(this);
top.add(new JScrollPane(chatms),BorderLayout.CENTER);
top.add(new JScrollPane(area),BorderLayout.SOUTH);
down=new JPanel();
JButton send=new JButton(" 发 送 ");
send.addActionListener(this);
down.add(new JLabel (" "));
down.add(send);
tubiao=new JLabel( new ImageIcon("frame/b1.jpg") );
tubiao.setHorizontalAlignment(SwingConstants.LEFT);
root.add(tubiao,BorderLayout.NORTH);
root.add(top,BorderLayout.CENTER);
root.add(down,BorderLayout.SOUTH);
f.getContentPane().add(root);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
public static void main(String[] args) {
new ClientFrame();
}
public void actionPerformed(ActionEvent e) {
String sss= area.getText();
try {
OutputStream out= socket.getOutputStream();
PrintWriter ps=new PrintWriter(out,true);
ps.println(sss);
} catch (IOException e1) {
e1.printStackTrace();
}
}
public void keyPressed(KeyEvent e) {
// if(e.getKeyCode()==e.VK_F & e.isControlDown())
// {
// String sss= area.getText();
// try {
// OutputStream out=s.getOutputStream();
// PrintWriter p=new PrintWriter(out,true);
// p.println(sss );
//
// } catch (IOException e1) {
//
// e1.printStackTrace();
// }
// }
}
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
server:package frame;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;
import javax.swing.border.LineBorder;public class ServerFrame implements ActionListener
{
JFrame f;
JPanel root ,top ,down;
JTextArea area,chatms;
JLabel tubiao;
Socket socket;
public ServerFrame()
{
initFrame();
try {
ServerSocket serverSocket=new ServerSocket(9000);
socket= serverSocket.accept();
InputStream inputStream= socket.getInputStream();
BufferedReader bf=new BufferedReader(new InputStreamReader(inputStream));
while(true){
String string= bf.readLine();
chatms.append("\n 客户端"+gettime()+"说: "+string);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public String gettime(){
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format( new Date());
}
public void initFrame()
{
f=new JFrame( "与客户端聊天中...");
f.setIconImage(Toolkit.getDefaultToolkit().getImage("imges/tb.jpg"));
f.setResizable(false);
f.setBounds(200,100,400,400);
//自定义根面板
root=new JPanel();
root.setLayout(new BorderLayout());
top=new JPanel(new BorderLayout( 5,15));
chatms=new JTextArea ();
chatms.setFont( Font.decode(" 黑体_GB2312-BOLD-13" ));
chatms.setBorder(new LineBorder(Color.blue));
chatms.setText ("ok");
chatms.setEditable(false);
chatms.setLineWrap(true);
chatms.setWrapStyleWord(true);
area =new JTextArea (4,20);
area.setFont( Font.decode(" 黑体_GB2312-BOLD-15" ));
area.setLineWrap(true);
area.setWrapStyleWord(true);
area.setBorder(new LineBorder(Color.blue));
top.add(new JScrollPane(chatms),BorderLayout.CENTER);
top.add(new JScrollPane(area),BorderLayout.SOUTH);
down=new JPanel();
JButton send=new JButton(" 发 送 ");
send.addActionListener(this);
down.add(new JLabel (" "));
down.add(send);
tubiao=new JLabel( new ImageIcon("frame/b1.jpg") );
tubiao.setHorizontalAlignment(SwingConstants.LEFT);
root.add(tubiao,BorderLayout.NORTH);
root.add(top,BorderLayout.CENTER);
root.add(down,BorderLayout.SOUTH);
f.getContentPane().add(root);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
public static void main(String[] args) {
new ServerFrame();
}
public void actionPerformed(ActionEvent e) {
String str=area.getText();
try {
OutputStream out = socket.getOutputStream();
PrintWriter ps=new PrintWriter(out,true);
ps.println(str);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}