【问题标题】:Java operations in Swing threadSwing 线程中的 Java 操作
【发布时间】:2015-05-05 23:27:17
【问题描述】:

我有问题。 代码如下:

JButton buttonChangeServer = new JButton("Change server");
    buttonChangeServer.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
                getLobbies();
            }
        }
    });

private void getLobbies() {
    lobbyListModel.removeAllElements();
    statusLabel.setText("Connecting...");
    final ArrayList<LobbyInfo> lobbyInfos = 
            UserClient.getLobbies(host, action, null);
    if (lobbyInfos != null) {
        setLobbies(lobbyInfos);
        statusLabel.setText("Sucessfully got lobby list from " + getHost());
    }
    else {
        statusLabel.setText("Failed to connect to " + getHost());
    }
}

如果无法建立连接,UserClient.getLobbies(host, action, null) 方法将执行 3 秒(超时)。 问题是这两个操作

lobbyListModel.removeAllElements();
statusLabel.setText("Connecting...");

执行时不可见。

我想问题是actionPerformed(ActionEvent e)中的方法getLobbies()在Swing线程中执行,直到getLobbies();执行结束才显示所有GUI操作

我的目标是显示在UserClient.getLobbies(host, action, null); 执行之前和之后GUI 的所有变化。我该如何管理?有没有一种简单的方法来显示所有这些?谢谢。

P.S.其中一种解决方案可能是将这个可能很长的操作放在另一个线程中,如下所示:

private void getLobbies() {
        lobbyListModel.removeAllElements();
        statusLabel.setText("Connecting...");
        new Thread(new Runnable() {
            @Override
            public void run() {
                final ArrayList<LobbyInfo> lobbyInfos = 
                    UserClient.getLobbies(host, action, null);
                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        if (lobbyInfos != null) {
                            setLobbies(lobbyInfos);
                            statusLabel.setText("Sucessfully got lobby list from " + getHost());
                        }
                        else {
                            statusLabel.setText("Failed to connect to " + getHost());
                        }
                    }
                });
            }
        }).start();
    }

它有效,但它相当复杂。有没有更简单的方法?

【问题讨论】:

  • SwingWorker 并不难——我建议研究一下。

标签: java multithreading swing thread-safety


【解决方案1】:

其中一种解决方案可能是将可能需要较长时间的操作放在另一个线程中

是的,不应在 EDT 上执行长操作(或阻塞操作)。

因此,您确实需要在单独的线程上执行长时间运行的任务。查看 Worker Threads and Swing Worker 上的 Swing 教程部分,了解 Swing 解决此问题的方法。

当您的查询完成执行后,您可以“发布”结果,以便在更新 Swing 组件时在 EDT 上执行代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-03
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多