Java Swing GUI 冻结 [英] Java swing GUI freezes

查看:38
本文介绍了Java Swing GUI 冻结的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用套接字编写 Java 客户端/服务器 GUI 应用程序,问题是:

I am writing a Java client/server GUI application using sockets and here is the problem:

我有一个按钮可以开始监听指定的端口:

I have a button to start listening for a specified port:

按钮动作执行方法

private void listenButtonActionPerformed(java.awt.event.ActionEvent evt) {                                             
    int port = Integer.parseInt(portTextfield.getText(), 10);

    try {
        socket.listen(port);
    } catch (IOException ex) {
    }
}

这里是socket.listen方法

Here is the socket.listen method

public static void listen() throws IOException {
    ServerSocket ss = new ServerSocket(port);

    while (true)
        new socket(ss.accept());
}

socket"类扩展Thread"
所以在 ss.accept() 返回一个值后,它会在单独的线程中创建新的套接字实例.

"socket" class extends "Thread"
So after ss.accept() returns a value it creates new socket instance in separate thread.

单击按钮后,GUI 冻结,因为在 socket.listen 方法中存在无限循环.我怎样才能避免这种情况?

After clicking the button the GUI freezes because inside the socket.listen method there is an infinite loop. How can I avoid that?

推荐答案

你的设计有两个陷阱:

  1. ss.accept() 是一个阻塞调用,因此您的 UI 将冻结,直到有传入连接
  2. 永远不要在 EDT 中运行 while(true) 循环.
  1. ss.accept() is a blocking call so your UI will freeze until there is an incoming connection
  2. Never run while(true) loops in the EDT.

改为执行以下操作:

  • 单击按钮后,创建一个线程,该线程将开始侦听传入的连接.
  • 每当您有传入连接时,创建另一个线程来接收传入客户端连接并处理它.

这篇关于Java Swing GUI 冻结的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆