import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import java.awt.*;
import java.net.*;
import java.awt.event.*;public class Ds
{
JFrame f=new JFrame("服务器端");
JButton b=new JButton("发送");
JTextArea jt=new JTextArea(12,21);

DatagramSocket socket=null;
DatagramPacket pa=null;
public Ds()
{
f.setBackground(Color.BLUE);
f.setSize(333, 333);
b.addActionListener(new Bu());
f.setLayout(new FlowLayout());
f.add(b);
f.add(jt);
f.setVisible(true);

}

  class Bu implements ActionListener
    {
       public void actionPerformed(ActionEvent e)
       {
       try
       {
         byte bb[]=new byte[1024];
       socket=new DatagramSocket(4700);
       pa=new DatagramPacket(bb,bb.length);
    jt.setText("1111");
       socket.receive(pa);
       String str=new String(pa.getData());
       jt.setText(str);
       }
       catch(Exception ee)
       {
       ee.getMessage();
       }
       }
    } public static void main(String[] args)
{
Ds d=new Ds(); }}我按下发送按钮后就卡住了,按钮一直保持被按下时的那种暗暗的颜色,如图:

解决方案 »

  1.   

    答:在GUI程序中,计算密集型或网络通信部分的代码,都要使用线程来设计。产生你的“卡住了”的原因是:当程序(更精确的说法是:GUI的事件派发线程)在“网络通信等待数据时”,它没有机会去响应你的MOUSE等事件了。
    一句话:不要在GUI的事件派发线程中进行计算密集型或长时间等待等耗时的操作。将这些耗时操作代码全部包装成线程,然后在GUI的事件派发线程中启动这些线程就行了。