gpt4 book ai didi

java GUI 多线程与套接字

转载 作者:太空宇宙 更新时间:2023-11-04 13:58:48 25 4
gpt4 key购买 nike

我正在尝试制作一个从 TCP 套接字获取数据的 GUI 程序。问题是当我设置套接字然后启动它时,GUI 程序卡住。我想添加一个通过使用单击事件来停止线程的函数。

据我所知我必须使用 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. socket接收

    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;
    }

}

最佳答案

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

在上面的行中,您没有启动一个线程,相反,您只是在同一线程中执行run()方法(就像任何其他方法调用一样)。

Thread扩展,然后调用info.start()

请参阅:Java 谜题:陷阱、陷阱和极端情况,作者:Joshua Bloch 和 Neal Gafter,Puzzle #76 .

关于java GUI 多线程与套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29530127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com