java - 刷新所有框架中的用户列表

标签 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));
    }
}

最佳答案

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

关于java - 刷新所有框架中的用户列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5646856/

相关文章:

java - BottomNavigationView 后退按钮无法正常工作

java - JPA:与确切类型的实体的一对一关系

java - 为什么java.lang.Object不能转换成T?

java - 如何重新绘制 JFrame 以更新变量值?

java - 如何将 JList 中的选定项获取到字符串中

Java 扫描器 while 循环

java - 无法使用 PDFBOX 获取页面中书签的具体位置

Java Connect4 游戏存在 GUI 错误问题

java - 按下按钮后,如何将 GUI 驱动程序类中的变量传输到 ActionListener 类?

java - 如何在不删除以前绘制的东西的情况下重新绘制