gpt4 book ai didi

java - 如何从另一个线程使用服务器更新 java swing gui?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:20:42 24 4
gpt4 key购买 nike

我有这个 Java Swing 应用程序,它启动一个新线程,每次传入客户端尝试建立连接时,该线程使用执行程序池打开套接字服务器。

应用程序需要两个按钮,一个用于启动服务器,另一个用于停止服务器。我想要的是显示服务器状态,并禁用相反的按钮,直到它的状态改变。

这就是我现在所拥有的,但我不知道当线程停止时我如何与 EDT 通信。我能做的就是检查 isRunning() 方法。

使用 SwingWorker 会更好吗?

public class ServerManager implements Runnable {

private Executor mExecutor = Executors.newSingleThreadExecutor();
private ServerSocket mServerSocket = null;
private int mDefaultPort = 43012;
private volatile boolean isRunning = false;

public ServerManager (int port){
mDefaultPort = port;
}

@Override
public void run() {
try {
mServerSocket = new ServerSocket(mDefaultPort);
isRunning = true;
while (isRunning){
mExecutor.execute(new IncomingClientThread(mServerSocket.accept()));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if(mServerSocket != null){
stop();
System.out.println("Server closed");
}
}
}

public void stop(){
try {
mServerSocket.close();
isRunning = false;
} catch (IOException e) {
throw new RuntimeException("Error closing server", e);
}
}

public synchronized boolean isRunning() {
return isRunning;
}

public int getServerPort (){
return mDefaultPort;
}
}

这就是我在 GUI 线程中所拥有的:我只使用一个按钮并在每次按下时更改其文本,但如果服务器由于某种原因断开连接,该按钮将保持不变。

connectButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if(mServer.isStopped()){
new Thread (mServer).start();
connectButton.setText("Desconectar");
infoLabel.setText("Servidor online en IP: " + NetworkUtils.getLocalIpAddress()
+ " puerto: " + mServer.getServerPort());
System.out.println(mServer.getIpAddress());
}else{
mServer.stop();
connectButton.setText("Conectar");
infoLabel.setText("Offline");
}
}
});

欢迎任何帮助!谢谢。

最佳答案

一个可能的解决方案是赋予它 SwingWorker 的部分功能——赋予它一个 SwingPropertyChangeSupport 对象,并允许您的 GUI 监听和响应状态变化。

例如,

public class ServerManager implements Runnable {
public static final String IS_RUNNING = "is running"; // for the Event's name
private SwingPropertyChangeSupport propChngSupport = new SwingPropertyChangeSupport(this);
private volatile boolean isRunning = false;
// other variables

// addPropertyChangeListener(...) {...} goes here
// removePropertyChangeListener(...) {...} goes here

public void setIsRunning(boolean isRunning) {
boolean newValue = isRunning;
boolean oldValue = this.isRunning;
this.isRunning = isRunning;
propChngSupport.firePropertyChange(IS_RUNNING, oldValue, newValue);
}

public void run() {
// ....
}

// other methods
}

关键是永远不要在其 setter 方法之外更改 isRunning 属性。

关于java - 如何从另一个线程使用服务器更新 java swing gui?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12790528/

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