我正在写一个套接字程序。它具有用于服务器和客户端的 GUI。在服务器 GUI 中有一个文本字段,显示用户请求的单词。 但是我在显示这个词时遇到了问题。
我试过了
txtWord.setText(sentword);
它没有在文本字段中显示单词。但是当我写这个的时候
txtWord.setText(sentword);
JOptionPane.showMessageDialog(null, "the requesed word is: "+sentword);
然后它在文本字段中显示该单词,并在消息框中显示它。
我试过 repaint() 但它不起作用。 请尽快给我一些解决方案
最佳答案
作为 @Binyamin
Sharet 正确评论,你有一个 Concurrency in Swing问题。
您的
Swing GUI
不关心您在后台运行的漫长而艰巨的任务甚至
JTextField#setText()
被声明为线程安全的,Socket
的输出(即)默认情况下从不通知 Event Dispatch Thread正确的方法是使用 SwingWorker专门为在 Swing GUI 后台运行长期而艰巨的任务而创建,并在事件线程或 EDT 上输出到 GUI
或者更简单的方法是在
Thread
中使用Runnable
,但要确保Swing GUI
的所有输出都已排队在 Swing 事件线程上,将其放置在 Runnable 中并使用invokeLater()
调用它
一个肮脏的 hack 是像这样包装代码行:
txtWord.setText(sentword);
JOptionPane.showMessageDialog(null, "the requesed word is: "+sentword);
进入 invokeLater()
,但在这种情况下,您的 GUI 将无法响应 Mouse
或 Keyboard
事件,直到 Socket
(在你的情况下)结束
关于java - 无法在 jTextField 中显示数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12550098/