如何处理两个不同的事件

时间:2011-12-28 02:00:54

标签: java swing chat

我正在制作一个简单的聊天GUI,我已经编写了服务器和GUI客户端,我可以从客户端GUI向服务器发送消息。

我的问题是从帧上的服务器接收消息。 当我使用无限循环时,框架被锁定。我不知道如何拆分这个东西以便在JTextArea上显示任何消息。 我的问题是: 有没有办法拆分框架来处理来自服务器的“发送”和“接收”信息?

我的GUI由JTextFieldJTextAreaJButton组成。

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){

                }}}});

2 个答案:

答案 0 :(得分:1)

您需要在后台线程上运行无限接收循环。

答案 1 :(得分:1)

您不应在后台线程中更新GUI组件。尝试使用SwingUtilities.invokeLater,不要忘记在文本区域使用revalidate()之类的东西。