Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法在jTextField中显示数据_Java_Swing_Sockets_Jtextfield_Event Dispatch Thread - Fatal编程技术网

Java 无法在jTextField中显示数据

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

我正在写一个套接字编程。它有用于服务器和客户端的GUI。在服务器GUI中有一个文本字段,显示用户请求的单词。 但是我在展示这个词时遇到了问题

我试过了

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 GUI
    的所有输出都在Swing事件线程上排队,方法是将其放置在Runnable中,并使用
    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);