刷新所有帧中的用户列表

时间:2011-04-13 09:09:23

标签: java swing

我尝试聊天。我的问题是,当另一个用户输入时,如何刷新用户列表,以便在所有打开的框架中可以看到用户列表?

import java.io.*;

public class MulticastChat implements Runnable, WindowListener, ActionListener {
    public InetAddress groupp;
    public int port;

    public MulticastChat (InetAddress group, int port) throws IOException {
    this.groupp = group;
    this.port = port;
    start();
    }
    public String [] user;
    public Frame frame;
    public TextArea output;
    public TextField input;
    public Button button;
    public Panel panel;
    public Panel p;
    public List list=new List(8);
    public TextField tf;

    public Thread listener;



    protected MulticastSocket socket;
    protected DatagramPacket outgoing, incoming;

    protected void initNet () throws IOException {
    socket = new MulticastSocket (port);
    socket.setTimeToLive (5);
    socket.joinGroup (groupp);
    outgoing = new DatagramPacket (new byte[1], 1, groupp, port);
    incoming = new DatagramPacket (new byte[65508], 65508);

    }
    public synchronized void start () throws IOException {
    if (listener == null) {
        initAWT ();
        initNet ();
        listener = new Thread (this);
        listener.start ();
        frame.setVisible (true);

        list.add(frame.getTitle());
    }
    }

    public void initAWT () {
    frame = new Frame
    ();
    frame.addWindowListener (this);

    tf=new TextField(10);
    output = new TextArea ();
    output.setEditable (false);
    button=new Button("Login");
    button.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {

        if (e.getActionCommand().equals("Login")) {
            try {
            if(!tf.getText().isEmpty()){

                byte[] utf = (tf.getText()+" Joined").getBytes ("UTF8");
                frame.setTitle(tf.getText());
                outgoing.setData (utf);
                outgoing.setLength (utf.length);
                socket.send (outgoing);
                input.setText ("");
                list.addItem(tf.getText());
                tf.setVisible(false);
                button.setVisible(false);
            }else{
                JOptionPane.showMessageDialog(frame, "Enter login name");
            } 
            } catch (IOException ex) {
                handleIOException (ex);
            }
        }
        }
    });
    panel=new Panel(new BorderLayout());
    p=new Panel(new BorderLayout());
    input = new TextField ();
    input.addActionListener (this);
    frame.setLayout (new BorderLayout ());
    panel.add(tf,"South");
    panel.add(list,"North");
    panel.add(button,"Center");
    frame.add(panel,"East");
    p.add (output, "Center");
    p.add (input, "South");
    frame.add(p,"West");
    frame.pack ();

    }


    public synchronized void stop () throws IOException {
    String s=frame.getTitle();
    frame.dispose();

    byte[] utf = (s+"Leaved").getBytes ("UTF8");
        outgoing.setData (utf);
        outgoing.setLength (utf.length);
        socket.send (outgoing);
    if (listener != null) {
        listener.interrupt ();
        listener = null;
        try {
        socket.leaveGroup (groupp);
        } finally {
        socket.close ();
        }
    }
    }

    public void windowOpened (WindowEvent event) {
    input.requestFocus ();
    }

    public void windowClosing (WindowEvent event) {
    try {

        stop ();

    } catch (IOException ex) {
        ex.printStackTrace ();
    }
    }

    public void windowClosed (WindowEvent event) {
    }
    public void windowIconified (WindowEvent event) {}
    public void windowDeiconified (WindowEvent event) {}
    public void windowActivated (WindowEvent event) {}
    public void windowDeactivated (WindowEvent event) {}

    public void actionPerformed (ActionEvent event) {
    try {
        byte[] utf = event.getActionCommand ().getBytes ("UTF8");
        outgoing.setData (utf);
        outgoing.setLength (utf.length);
        socket.send (outgoing);
        input.setText ("");


    } catch (IOException ex) {
        handleIOException (ex);
    }
    }

    protected synchronized void handleIOException (IOException ex) {
    if (listener != null) {
        output.append (ex + "\n");
        input.setVisible (false);
        frame.validate ();
        if (listener != Thread.currentThread ())
        listener.interrupt ();
        listener = null;
        try {
        socket.leaveGroup (groupp);
        } catch (IOException ignored) {
        }
        socket.close ();
    }
    }

    public void run () {

    try {

        while (!Thread.interrupted ()) {
        incoming.setLength (incoming.getData ().length);
        socket.receive (incoming);
        String message = new String
        (incoming.getData (), 0, incoming.getLength (), "UTF8");
        output.append (incoming.getAddress().toString()+frame.getTitle()+message + "\n");
        }
    } catch (IOException ex) {
        handleIOException (ex);
    }

    }
    public void refresh(){

    }

    public static void main (String[] args) throws IOException {

    InetAddress group;

        group = InetAddress.getByName("235.235.235.235");

    int port = 2999;
    new Thread(new MulticastChat(group, port));
    }
}

3 个答案:

答案 0 :(得分:1)

  • 以特定时间间隔更新列表。(投票机制)
  • 从客户端发送一些数据(哈希)并在服务器上检查它是否有需要更新的返回数据包和一些指令,以便客户端刷新列表

答案 1 :(得分:0)

我知道这个答案不是那么具有描述性,而是尝试让它创建一个事件处理程序,只是为了控制新用户何时进入聊天。就像这样:

public void newUserIn (UserEvent event) {}

左右......

答案 2 :(得分:0)

首先,我建议您将代码分成许多类,以便于阅读和维护。为您的网络IO提供一个类,为Window提供另一个类。将两者与侦听器接口链接起来。

其次,您需要创建一条指示用户已加入的多播消息。这可能类似于“[NEW-USER:xxxxxx]”。

然后,您需要检查客户端中的传入消息,以识别“新用户”消息。然后,您可以在用户界面中显示该用户。

您还应该阻止用户欺骗您的新用户消息。如果他们输入与新用户模式匹配的内容,请将其转义,以免误解。