我正在制作一个简单的聊天GUI,我已经编写了服务器和GUI客户端,我可以从客户端GUI向服务器发送消息。
我的问题是从帧上的服务器接收消息。
当我使用无限循环时,框架被锁定。我不知道如何拆分这个东西以便在JTextArea
上显示任何消息。
我的问题是:
有没有办法拆分框架来处理来自服务器的“发送”和“接收”信息?
我的GUI由JTextField
,JTextArea
和JButton
组成。
按JButton
时,JTextField
中的文字将通过以下方式发送到服务器:
String u = jTextField.getText();
out.writeUTF(u);
但我不知道应该做些什么来让JTextArea
减少所有时间来获取信息:
msg = in.readUTF();
jta.append(msg + "\n");
//
如果线程是GUI类中的一个类或组件,因为我已经使线程evrything似乎工作但按摩不在jTextField
上。我在同一个文件中的服务器中创建了线程,但是没有工作:
class bacgroundTask extends Thread{
static String msg;
static JTextArea jta;
static DataInputStream in;
public void run(){
while(true){
try{
msg = in.readUTF();
jta.append(msg + "\n");
}
catch(IOException ioe){}}}}
//
嗨,这又是我,我尝试使用invokelater方法,但框架frezze执行时我不能clik发送按钮或键入jtextfield
中的文本。任何机构可以向我解释一下他们的方法吗?在我的情况下他们是对的。
我曾经尝试过和不使用。
SwingUtilities.invokeLater(
new Runnable(){
public void run(){
while(true){
try{
msg = in.readUTF();
jta.append(msg + "\n");
jta.revalidate();
}
catch(IOException ioe){
}}}});
答案 0 :(得分:1)
您需要在后台线程上运行无限接收循环。
答案 1 :(得分:1)
您不应在后台线程中更新GUI组件。尝试使用SwingUtilities.invokeLater,不要忘记在文本区域使用revalidate()之类的东西。