gpt4 book ai didi

Swing 线程中的 Java 操作

转载 作者:行者123 更新时间:2023-12-01 18:15:16 24 4
gpt4 key购买 nike

我有一个问题。这是代码:

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.getLobbyes(host, action, null) 方法将执行 3 秒(超时)。问题就在于这两个操作

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

执行时不可见。

我认为问题是 actionPerformed(ActionEvent e) 中的方法 getLobbys() 在 Swing 线程中执行,并且所有 GUI 操作都没有显示,直到getLobbys();

执行结束

我的目的是显示在执行UserClient.getLobbyes(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();
}

它可以工作,但是相当复杂。有没有更简单的方法?

最佳答案

One of the solutions may be putting that potentially long operation in another thread

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

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

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

关于Swing 线程中的 Java 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30064902/

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