use*_*881 4 java sockets swing jtextfield event-dispatch-thread
我正在编写套接字编程.它具有服务器和客户端的GUI.在服务器GUI中有一个文本字段,显示用户请求的单词.但我在表达这个词时遇到了问题.
我试过了
txtWord.setText(sentword);
Run Code Online (Sandbox Code Playgroud)
它没有在文本字段中显示该单词.但是当我写这个
txtWord.setText(sentword);
JOptionPane.showMessageDialog(null, "the requesed word is: "+sentword);
Run Code Online (Sandbox Code Playgroud)
然后它会在文本字段中显示该单词,并在消息框中显示该单词.
我尝试过repaint()但是它有效.请尽快给我一些解决方案
正如@BinyaminSharet正确评论的那样,你在Swing问题上有一个并发.
你Swing GUI并不关心你在后台运行的漫长而艰巨的任务
even JTextField#setText()声明为线程安全,Socket默认情况下从(ie)输出从未通知Event Dispatch Thread
正确的方法可能是使用专门为Swing GUI运行长和硬任务背景并在事件线程或EDT上输出到GUI 的SwingWorker
或者更简单的是在a Runnable中使用a Thread但确保所有输出Swing GUI都在Swing事件线程上排队,方法是将它放在Runnable中并用它调用它invokeLater()
一个脏的黑客是包装代码行,如下所示:
txtWord.setText(sentword);
JOptionPane.showMessageDialog(null, "the requesed word is: "+sentword);
Run Code Online (Sandbox Code Playgroud)
进入invokeLater(),但在这种情况下,您的GUI将无响应Mouse或Keyboard事件,直到Socket(在您的情况下)结束