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();
}
}
}
窗口弹出来了,但是里面的组件不显示,而且窗口还不能关闭,程序好像死在那里。

解决方案 »

  1.   

    QQ窗口代码写的很麻烦,里面包含了一个Client和一个Server对象,您将就着看吧,没用的代码我删了删。
    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;
    }
    }
    }
    }
    }
      

  2.   

    swing  组件和AWT不一样的地方时=是: 
         swing 组件必须要添加到 内容面板中()才可以的,不能直接添加到顶级容器中。     Awt组件可以直接添加到顶级容器(Frame)中
    使用Swing的基本规则 :1、Swing的基本组件要布局在内容面板中,而不能直接放在顶级容器中。2、 Swing的内容面板要添加到Swing的顶层容器中才能显示,通过setContentPane (container)等方法来实现。3、每个GUI组件只能被容纳一次。4、避免使用非Swing的重量级组件。 
      

  3.   


    谢谢您的回答,可是我这里面既有Swing,也有awt,我用的时候根本就没在意它是swing还是awt。
    我单独运行Client类的时候,窗口里的组件都可以正常显示出来的,这里一调用就显示不出来了。
      

  4.   

    java中的1.5版本发布之后,swing的组件直接可以加到顶级容器中的,有没有设置JFrame中的setVisible方法啊
      

  5.   

    界面处理那块看了下,好像没啥问题。代码没法运行,你自己 Debug下,看问题出在哪个地方。
      

  6.   


    设置了啊,这个是不会忘的。
    QQ窗口已经弹出了,只是里面是空的,组件都没有显示
    我单独测试QQ类的时候,运行得没有问题,在这里通过点击JTree叶节点来开启QQ窗口就出现问题了
    我还是没有找出问题所在
      

  7.   

    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();
    }
    ===========================================================
    仔细看了一下,感觉你的思路有些问题。
    首先,你做的的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();
    }
     
     
     
    }

    }