【发布时间】: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