Java 未调用SwingWorker.process
编辑: 我解决了我的问题:Java 未调用SwingWorker.process,java,swing,swingworker,Java,Swing,Swingworker,编辑: 我解决了我的问题: while(!finish.equals("readline")){ publish(finish); finish = Main.in.readLine(); } 必须更改为: while(true){ publish(finish); finish = Main.in.readLine(); } 老问题是: 我正在用Java编写一个聊天应用程序,我制作了一个简单的Gui,它运行良好。但现在我已经重写了收集聊天信息的部分,使之成为
while(!finish.equals("readline")){
publish(finish);
finish = Main.in.readLine();
}
必须更改为:
while(true){
publish(finish);
finish = Main.in.readLine();
}
老问题是:
我正在用Java编写一个聊天应用程序,我制作了一个简单的Gui,它运行良好。但现在我已经重写了收集聊天信息的部分,使之成为线程安全的。
登录时,服务器会将聊天中的所有消息推送到客户端,这很好。在这一刻之后,GUI继续响应,我可以发送命令并将它们发送到服务器,但是没有调用process方法,因此没有返回任何内容。
我做错了什么
以下是我所说的代码:
package Client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.List;
import javax.swing.SwingWorker;
public class ChatReceiver extends SwingWorker<Void, String> {
@Override
protected Void doInBackground() {
try {
Main.echoSocket = new Socket(Main.ip, 4444);
Main.out = new PrintWriter(Main.echoSocket.getOutputStream(), true);
Main.in = new BufferedReader(new InputStreamReader(
Main.echoSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host.");
} catch (IOException e) {
System.err.println("Couldn't get I/O for "
+ "the connection to: localhost.");
}
publish("Sending Login-Request...");
Main.out.println("login");
try {
String text = Main.in.readLine();
String status = Main.in.readLine();
publish("Receiving: " + text + " " + status);
if(status.equals("readline") && text.equals("ready")){
String finish = "logging in...";
Main.out.println(Main.name + " SZUTKEY");
while(!finish.equals("readline")){
publish(finish);
finish = Main.in.readLine();
}
}else{
throw new RuntimeException("Fuck it login died!");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void process(List<String> chats) {
Main.printTest("xxx");
for(String s : chats.toArray(new String[0])){
Main.printTest("called");
Main.printTest(s);
}
Main.textField.validate();
Main.textField.repaint();
}
}
- 你的
- 你,
- 在
中,只能调用done()
get()
readLine
调用是非阻塞的吗?也许您的客户端正在等待服务器发送换行符,这将阻止您的doInBackground
方法,并避免将更新推送到进程
方法感谢您的评论,实际上,我不希望工作人员调用done()中的任何内容,因为它永远不会完成。但我认为,这可能是我代码中的问题。我会尝试一些东西,然后给大家一个更新!那么使用SwingWorker
是错误的决定,使用Runnable#Thread
相反,在那里你可以控制流,也就是说,SwingWorker
被指定运行一次,嗯,可以有另一个选项,使用,但是Runnable#Thread
是清晰的,更容易管理的,从
loginAction = new AbstractAction("Login") {
/**
*
*/
private static final long serialVersionUID = -3279591081543889275L;
@Override
public void actionPerformed( ActionEvent arg0 ) {
name = JOptionPane.showInputDialog("Please input your Chatname");
ip = JOptionPane.showInputDialog("Please input the Chatserver-IP", "localhost");
(chat = new ChatReceiver()).execute();
}
};