我要是在按钮里面new,点击按钮之后,直接就卡在那里啦,显示的窗口里面没东西,好长时间才显示完全
            换句话说,就是在main里new速度快,在按钮里new  反应很慢
                           望高人指点代码如下:package chatSystem;import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.List;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.*;
import java.io.*;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class ChatFrame extends JFrame{
  String savechat="";
 
 Socket Server;
 boolean yesornot=false;
 
 List friendlist=new List();
 
 JSplitPane jsp=null;
 JPanel jp0=new JPanel();
 JPanel jpWest=new JPanel();
 JPanel jpEast=new JPanel();
 JPanel jpSouth=new JPanel();
 JPanel jp1=new JPanel();
 JPanel jp2=new JPanel();
 JPanel jp3=new JPanel();
 JPanel jp4=new JPanel();
 JPanel jp5=new JPanel();
 JPanel jp6=new JPanel();
 
 
 JScrollPane jspcenter=new JScrollPane();
 JScrollPane jspeast=new JScrollPane();
 JScrollPane jspsouth=new JScrollPane();
 
 
 JMenuBar mb=new JMenuBar();
 JMenu mFile = new JMenu("文  件");
 JMenu mHelp = new JMenu("帮  助");
 JMenuItem exit=new JMenuItem("退出");
 JMenuItem help=new JMenuItem("关于");
 
 JButton start=new JButton("开始聊天");
 JButton administer=new JButton("聊天管理");
 
 JLabel display=new JLabel();
 JLabel leftdisplay=new JLabel("<html>▁▂▁<br>▁▂▁<br>▁▂▁<br>▁▂▁<br>▁▂▁<br>▁▂▁<br>▁▂▁<br>▁▂▁<br>▁▂▁<br><▁▂▁<br>▁▂▁<br>▁▂▁<br>▁▂▁<br>▁▂▁<br>▁▂▁<br>▁▂▁<br>▁▂▁<br>▁▂▁<br>▁▂▁<br>");
 
 JLabel friendlable=new JLabel("用户列表");
 
 JLabel uplabel=new JLabel("聊天室公告");
 JLabel centerlabel=new JLabel("<html>此处为聊天室公告,<br>管理员可以修改!!");
 JLabel downlabel=new JLabel("↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
 JLabel leftlabel=new JLabel("<html>→<br><→<br>→<br>→<br>→<br>→<br>→<br>");
 JLabel rightlabel=new JLabel("<html>←<br>←<br>←<br>←<br>←<br>←<br>←<br>");
 
 JLabel frontclew=new JLabel("欢迎来到聊天室,祝您聊的开心!");
 JLabel leftclew=new JLabel("<html>请<br>遵否<br>守则<br>聊将<br>天被<br>室踢<br>规出<br>章"); 
  JButton sidle=new JButton("悄悄话▲");
 JButton expression=new JButton("表情▲");
 JButton font=new JButton("字体▲");
 JButton history=new JButton("历史记录▲");
 JButton cls=new JButton("清屏");
 
 
 JButton enter=new JButton("发送");
 JButton  cleanout=new JButton("清空");
 
 
 
 
 JTextArea chattest=new JTextArea();
 
 String serviceip;
 int serviceportnum;
 public ChatFrame(String ip,int portnum){
  
  serviceip=ip;
  serviceportnum=portnum;
  
  this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  this.setBounds(screenSize.width/2-400, screenSize.height/2-300, 800, 600);
  this.setTitle("聊天室");
  
  
  mb.add(mFile);
  mb.add(mHelp);
  mFile.add(exit);
  mHelp.add(help);
  this.setJMenuBar(mb);
  
  jp0 = (JPanel) this.getContentPane();
  jp0.setLayout(new BorderLayout());
  jp0.add(jpWest,BorderLayout.WEST);
  
  BorderLayout glout=new BorderLayout();
  glout.setVgap(60);
  jpWest.setLayout(glout);
  jpWest.add(start,BorderLayout.NORTH);
  jp1.setLayout(new BorderLayout());
  jp1.add(administer,BorderLayout.NORTH);
  leftclew.setFont(new Font("宋体",3,30));
  jp1.add(leftclew,BorderLayout.CENTER);
  jpWest.add(jp1,BorderLayout.CENTER);
  
  
  
  jsp=new JSplitPane(JSplitPane.VERTICAL_SPLIT,jp4,jpSouth);
  jspcenter.setViewportView(display);
  jp4.setLayout(new BorderLayout());
  jp4.add(leftdisplay,BorderLayout.WEST);
  jp4.add(jspcenter,BorderLayout.CENTER);
  
  jp2.add(sidle);
  jp2.add(expression);;
  jp2.add(font);
  jp2.add(history);
  jp2.add(cls);
 
  jpSouth.setLayout(new BorderLayout());
  jpSouth.add(jp2,BorderLayout.NORTH);
  chattest.setFont(new Font("宋体",1,40));
  chattest.setLineWrap(true);
  jspsouth.setViewportView(chattest);
  jp3.setLayout(new BorderLayout());
  jp3.add(enter,BorderLayout.NORTH);
  jp3.add(cleanout,BorderLayout.SOUTH);
  jpSouth.add(jspsouth,BorderLayout.CENTER);
  jpSouth.add(jp3,BorderLayout.EAST);
  
  jp0.add(jsp,BorderLayout.CENTER);
  
  frontclew.setFont(new Font("宋体",1,40));
  frontclew.setHorizontalAlignment(JTextField.CENTER);
  jp0.add(frontclew,BorderLayout.NORTH);
  
  jp5.setLayout(new BorderLayout());
  uplabel.setHorizontalAlignment(JTextField.CENTER);
  jp5.add(uplabel,BorderLayout.NORTH);
  jp5.add(downlabel,BorderLayout.SOUTH);
  jp5.add(leftlabel,BorderLayout.WEST);
  jp5.add(rightlabel,BorderLayout.EAST);
  centerlabel.setHorizontalAlignment(JTextField.CENTER);
  jp5.add(centerlabel,BorderLayout.CENTER);
  
  
  
  jp6.setLayout(new BorderLayout());
  friendlable.setHorizontalAlignment(JTextField.CENTER);
  jp6.add(friendlable,BorderLayout.NORTH);
  jp6.add(friendlist,BorderLayout.CENTER);
  
  jpEast.setLayout(new BorderLayout());
  jpEast.add(jp5,BorderLayout.NORTH);
  jpEast.add(jp6,BorderLayout.CENTER);
  jp0.add(jpEast,BorderLayout.EAST);
  
  
  
  
  
 
  
  help.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    javax.swing.JOptionPane.showMessageDialog(null, "       作者:英雄小强\n" + "       英文名为:hero\n" + "     希望大家多多支持", "我的基本信息", JOptionPane.INFORMATION_MESSAGE);
   }});
  
  exit.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent arg0) {
    // TODO Auto-generated method stub
    yesornot=true;
    System.exit(0);
   }
   });
   
  font.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent arg0) {
    // TODO Auto-generated method stub
    new MyFont(chattest);
   }});  
  this.setVisible(true);
  
  try {
   client();
  } catch (Exception e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
 }
  public void client()throws Exception{
   savechat=savechat+"<html>";
   Server = new Socket(serviceip,serviceportnum);
   BufferedReader in = new BufferedReader(new InputStreamReader(Server.getInputStream()));
   final PrintWriter out = new PrintWriter(Server.getOutputStream());
   
   enter.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent arg0) {
     // TODO Auto-generated method stub
     String str = chattest.getText();
     out.println(str);
     out.flush();
    }});
  
   while (true) {
    String str=in.readLine();
    savechat=savechat+str+"<br>";
    display.setText(savechat);
    savechat=savechat+"<br>";
    if (yesornot) {
     break;
    }
   }
   in.close();
   out.close();
   Server.close();
  }}

解决方案 »

  1.   

      try {
      client();
      } catch (Exception e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
      }
    可能是这段。
    使用一个WindowListener监听 JFrame,在 windowOpened 方法里用一个单独的线程启动上面那段代码。
      

  2.   

    谢了  这样写就OK拉public void client()throws Exception{
    savechat="<html>";
    Server = new Socket(serviceip,serviceportnum);
    final PrintWriter out = new PrintWriter(Server.getOutputStream());

    enter.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent arg0) {
    // TODO Auto-generated method stub
    String str = chattest.getText();
    out.println(str);
    out.flush();
    out.close();
    }});
    out.close();
    Thread thread=new Thread(this);
    thread.start();
    }


    public void run() {
    BufferedReader in = null;
    try {
    in = new BufferedReader(new InputStreamReader(Server.getInputStream()));
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    while (true) {
    String str = null;
    try {
    str = in.readLine();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    savechat=savechat+str+"<br>";
    display.setText(savechat);
    if (yesornot) {
    break;
    }
    }
    try {
    in.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    try {
    Server.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }