带GUI的java GUI多线程

时间:2015-04-09 05:00:34

标签: java multithreading swing sockets

我正在尝试创建一个从TCP套接字获取数据的GUI程序。 问题是当我设置套接字,然后启动它,GUI程序冻结。 我想通过使用click事件添加一个停止线程的函数。

据我所知,我必须使用EDT,但我尝试过但不起作用。有没有人可以帮助我?

这是我的代码。

  1. public class ImageSplit {  
    static ImageViewerFrame program;
    public static void main(String[] args) throws IOException {  
    JPanel[] displayArray = new JPanel[100];   
    program = new ImageViewerFrame();
    
    EventQueue.invokeLater(new Runnable(){
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            program.setVisible(true);
        }
    
    });
    } 
    
  2. void createMouseMenu() {
    final PopupMenu menu = new PopupMenu();
    MenuItem grid = new MenuItem("Grid");
    MenuItem start = new MenuItem("Start");
    MenuItem stop = new MenuItem("Stop");
    menu.add(grid);
    menu.add(start);
    menu.add(stop);
    add(menu);
    
    mouseMenuHandler mousemenu = new mouseMenuHandler();
    
    grid.addActionListener(mousemenu);
    start.addActionListener(mousemenu);
    stop.addActionListener(mousemenu);
    
    addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
            if (e.getModifiers() == InputEvent.BUTTON3_MASK)
                menu.show(e.getComponent(), e.getX(), e.getY());
        }
    });
       }
    class mouseMenuHandler implements ActionListener {
    getInfo info;
    
    public void actionPerformed(ActionEvent e) {// open grid setting
        if (e.getActionCommand().equals("Grid")) {
            gridSettingUI = new GridSetting(img);
            gridSettingUI.setVisible(true);
        } else if (e.getActionCommand().equals("Start")) {
            try {
                info = new getInfo(40000);//open socket
                info.run();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        } else if (e.getActionCommand().equals("Stop")) {
            System.out.println("stop");
            info.stop();
        }
    }
    }
    
  3. 套接字

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    
    
    public class getInfo implements Runnable{
    ServerSocket serverSocket;
    private boolean stopped=false;
    
    public getInfo(int port_num) throws IOException{
    serverSocket = new ServerSocket(port_num);
    }
    @Override
    public void run() {
    // TODO Auto-generated method stub
    while(!stopped){
    try {
    Socket socket = serverSocket.accept();
    System.out.println(socket.getInetAddress()+ "connected");
    
    InputStream is = socket.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    if(br.ready())
    {
    String line = br.readLine();
    System.out.println(line+"\n");
    }
    } catch (IOException e) {
    // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    }
    
    public void stop(){
    stopped = true;        
    }
    
  4. }

2 个答案:

答案 0 :(得分:0)

info = new getInfo(40000);//open socket
info.run();

在上面的行中,你是 NOT 启动一个线程,而你只是在同一个线程中执行run()方法(就像任何其他方法调用一样)。 / p>

Thread延伸,然后致电info.start()

请参阅: Java Puzzlers:陷阱,陷阱和角落案例作者:Joshua Bloch和Neal Gafter,Puzzle #76

答案 1 :(得分:0)

我写了一个名为Jexxus的库,它可以让你更容易地使用套接字。它将自动在不同的线程上执行操作,因此您的UI不会冻结。页面底部有一个小教程:https://github.com/mirraj2/Jexxus/tree/master