gpt4 book ai didi

java - Applet 和 Servlet 通信 block GUI

转载 作者:行者123 更新时间:2023-12-02 06:10:40 25 4
gpt4 key购买 nike

我正在尝试从小程序调用 servlet,然后在小程序 gui 中显示 servlet 的响应,问题是当我按下按钮调用 servlet 时,GUI 会阻塞,直到响应到达,我尝试将请求的代码放入线程中,但是它卡住了 gui,这是代码:

public class SearchApplet extends JApplet implements ActionListener{
JTextField JTF_address;

public void init() {
JLabel JL_address = new JLabel("Address: ");
JL_address.setFont(new Font("OpenSans", Font.PLAIN, 16));
JTF_address = new JTextField(20);
....
}

public void actionPerformed(ActionEvent e) {
SearchThread search = new SearchThread();
search.run();
}

public class SearchThread implements Runnable {

public SearchThread() {
}

public void run() {

try {
String input = "prova";
URLConnection con = getServletConnection();
OutputStream outstream = con.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(outstream);
oos.writeObject(input);
oos.flush();
oos.close();

// receive result from servlet
InputStream instr = con.getInputStream();
ObjectInputStream inputFromServlet = new ObjectInputStream(instr);
String result = (String) inputFromServlet.readObject();
inputFromServlet.close();
instr.close();

// show result
JTF_address.setText(result);

} catch (Exception ex) {
ex.printStackTrace();
System.out.println(ex.toString());
}
}
}

}

我该怎么办?

最佳答案

不要打电话

search.run();

通话

new Thread(search).start(); 

相反。

在你的actionPerformed中,你只是调用当前线程中运行的方法。如果您改为调用 start(),它会发挥神奇作用并启动执行 run() 的新线程。

那么您应该修改显示结果的方式,因为您无法在非 AwtEventQueue 的线程中更改 UI...您可以考虑这样的事情:

      //...

// show result
final String myResult=result;
SwingUtilities.invokeLater(new Runnable(){
public void run(){
JTF_address.setText(myResult);
}
});

关于java - Applet 和 Servlet 通信 block GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21922350/

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