Java 无法在jTextField中显示数据
我正在写一个套接字编程。它有用于服务器和客户端的GUI。在服务器GUI中有一个文本字段,显示用户请求的单词。 但是我在展示这个词时遇到了问题 我试过了Java 无法在jTextField中显示数据,java,swing,sockets,jtextfield,event-dispatch-thread,Java,Swing,Sockets,Jtextfield,Event Dispatch Thread,我正在写一个套接字编程。它有用于服务器和客户端的GUI。在服务器GUI中有一个文本字段,显示用户请求的单词。 但是我在展示这个词时遇到了问题 我试过了 txtWord.setText(sentword); 它没有在文本字段中显示单词。但是当我写这个的时候 txtWord.setText(sentword); JOptionPane.showMessageDialog(null, "the requesed word is: "+sentword); 然后,它在文本字段中显示该单词,并在mes
txtWord.setText(sentword);
它没有在文本字段中显示单词。但是当我写这个的时候
txtWord.setText(sentword);
JOptionPane.showMessageDialog(null, "the requesed word is: "+sentword);
然后,它在文本字段中显示该单词,并在messagebox中显示该单词
我试过重新油漆,但没用。
请尽快给我建议一些解决方案因为
@Binyamin
Sharet正确地评论说,您有一个问题
- 您的
不关心您在后台运行的冗长而艰巨的任务Swing GUI
- 甚至
也被声明为线程安全,默认情况下从不通知来自JTextField#setText()
Socket的输出
- 正确的方法可能是使用专门创建的用于在Swing GUI上运行长时间和硬任务的后台,并在事件线程或EDT上输出到GUI
- 或者更简单的方法是在
线程中使用
,但要确保Runnable
的所有输出都在Swing事件线程上排队,方法是将其放置在Runnable中,并使用Swing GUI
invokeLater()调用它
- 一个糟糕的做法是像这样包装代码行:
进入
invokeLater()
,但在这种情况下,GUI将对鼠标
或键盘
事件无响应,直到套接字
(在您的情况下)结束txtWord.requestFocus()强>
文本字段只有在窗口位于文本字段上方并返回时才会显示,或者只有在单击它时才会获得焦点。所以只要请求焦点
此外,如果在创建时设置了文本大小,请检查文本大小。如果大小不匹配,则有时不会显示文本
例如:txtWord.setSize(200,24) 您是否在一个线程上执行所有操作?如果是这样,您需要将所有非UI操作移动到不同的线程,否则您将阻塞UI线程,并且您将看不到UI更新。看起来是这样的,在第二个示例中,您确实看到了这个词,因为阻塞操作是一个UI操作,它不会返回到您的线程,而是不断更新UI。-1您不需要使用
LayoutManager调用setBounds
。无论文本字段是否具有焦点,调用setText
都应该将文本放置在文本字段中setSize
在使用LayoutManager
时也不需要。所有大小和定位都是由父容器上的LayoutManager
调用in/re/validate
完成的,而不是setBounds/Size
等。遗憾的是,在Java 7中不再是线程安全的;另见。
txtWord.setText(sentword);
JOptionPane.showMessageDialog(null, "the requesed word is: "+sentword);