无法在jTextField中显示数据

4
我正在编写一个套接字程序。它具有服务器和客户端的图形用户界面(GUI)。在服务器GUI中,有一个文本框显示用户请求的单词。但我在显示该单词方面遇到了问题。
我已经尝试过:
txtWord.setText(sentword);

它没有在文本框中显示单词。但是当我输入这个时。
txtWord.setText(sentword);
JOptionPane.showMessageDialog(null, "the requesed word is: "+sentword);

然后它在文本框中显示单词,并在消息框中显示该单词。
我尝试过repaint(),但它没有起作用。 请尽快为我提供一些解决方案。

你是否在一个线程上执行所有操作?如果是这样,您需要将所有非 UI 操作移到不同的线程中,否则您将阻塞 UI 线程,并且您将看不到 UI 更新。看起来是这种情况,因为在你的第二个例子中,你确实看到了单词,因为阻塞操作是一个 UI 操作,它不会返回到你的线程,但会持续更新 UI。 - MByD
2个回答

9

正如@Binyamin Sharet正确评论的那样,您有一个Swing中的并发问题

  • 您的Swing GUI并不关心您在后台运行的长时间和艰苦的任务

  • 即使JTextField#setText()被声明为线程安全,来自Socket(例如)的输出默认情况下也永远不会通知Event Dispatch Thread

  • 正确的方法可能是使用专门用于在Swing GUI中后台运行长时间和艰苦任务并在事件线程或EDT上向GUI输出的SwingWorker

  • 甚至更简单的方法是在Thread中使用Runnable,但确保所有输出到Swing GUI都排队在Swing事件线程上,方法是将其放入一个Runnable中,并使用invokeLater()调用它

  • 一个肮脏的hack是这样包装代码行:

txtWord.setText(sentword);
JOptionPane.showMessageDialog(null, "the requesed word is: "+sentword);

将代码放入invokeLater()中,但在这种情况下,您的GUI将对MouseKeyboard事件无响应,直到Socket(在您的情况下)结束。

1
可悲的是,在Java 7中,setText()不再是线程安全的;还可以参考Echo - trashgod

-1

txtWord.requestFocus(); 文本字段在窗口覆盖它并返回或获得焦点之前不会显示,直到单击它。所以...只需请求焦点。

另外,如果在创建时设置了文本大小,请检查文本大小。如果大小不匹配,则有时不会显示文本。 例如:txtWord.setSize(200, 24);


1
使用“布局管理器”时,您不需要调用“setBounds”。而且,无论文本字段是否具有焦点,调用“setText”都应该将文本放置在文本字段中。 - Robin
1
当使用LayoutManager时,也不需要使用setSize。所有的大小和位置都由LayoutManager完成。 - Robin
调用父容器上的 in/re/validate,而不是使用 setBounds/Size 等方法。 - Andrew Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接