2 votes

Mise à jour dynamique de Jlist

J'ai beaucoup lu sur Swing mais je suis arrivé à une impasse et je sais que vous pouvez m'aider. J'ai lu beaucoup de questions comme Mise à jour d'un JList mais je suis toujours perplexe quant à la marche à suivre. Mon problème est le même que celui du monsieur qui a posé la question que j'ai mentionnée. Je suis en train de créer un serveur et les utilisateurs y accèderont. Voici mes classes.

Serveur

private string name;
private string dateOfAccess;

@Override
public String toString() {
    // TODO Auto-generated method stub
    return nombreAmigo;
}

Main

private DefaultListModel listModel = new DefaultListModel();
private JList list=new JList(listModel);

et mon ClientHandler

public static List clientes=new ArrayList();

Donc, je vais remplir la liste des clients depuis différents threads lorsqu'ils se connectent à mon serveur et j'ai besoin de les afficher dans mon JList. Des suggestions sur la façon de le mettre à jour ? Je suis vraiment bloqué ici. Merci !

5voto

MadProgrammer Points 161522

Personnellement, j'aurais un genre de "gestionnaire de clients" qui est responsable de regrouper tous les clients dans un référentiel centralisé. Ce serait un singleton dans votre serveur. Il pourrait être interrogé à tout moment pour obtenir une liste des utilisateurs actuellement actifs (et d'autres fonctions de gestion), mais il ne devrait y en avoir qu'un actif.

Le gestionnaire déclencherait ensuite des événements de notification à l'intention des parties intéressées (en utilisant un modèle d'observation).

Une de ces parties serait votre interface utilisateur. Lorsqu'un événement "connexion" ou "déconnexion" est déclenché, vous devrez vous assurer que cela est synchronisé avec le Fil de Dispatching d'Événements AVANT d'essayer de mettre à jour le modèle de liste, par exemple...

public void userConnected(UserManagerEvent evt) { // Vous devrez définir tout cela vous-même...
    final Conexion user = evt.getConnection(); // Vous devrez définir cet événement vous-même...
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            listModel.addElement(user);
        }
    });
}

L'implémentation réelle dépendra de ce que vous voulez accomplir et de la manière dont vous voulez le réaliser, mais voici le concept de base...

Mis à jour avec un exemple conceptuel

Il s'agit d'un exemple conceptuel de base. Un événement est déclenché par le bouton, qui simule (par exemple) une connexion. Cet événement est ensuite envoyé à la liste, via une interface auditeur, où le modèle est mis à jour

entrer la description de l'image ici

Les événements sont générés à partir d'une autre source et l'interface utilisateur est mise à jour lorsqu'ils se produisent, modèle d'observation classique

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import org.w3c.dom.ls.LSInput;

public class UpdateListOnEvent {

    public static void main(String[] args) {
        new UpdateListOnEvent();
    }

    public UpdateListOnEvent() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ConnectionEvent {

        private Date date;

        public ConnectionEvent(Date date) {
            this.date = date;
        }

        public Date getDate() {
            return date;
        }

    }

    public interface ConnectionListener {
        public void connectionEstablished(ConnectionEvent evt);
    }

    public class TestPane extends JPanel implements ConnectionListener {

        private JList list;
        private DefaultListModel model;

        public TestPane() {
            setLayout(new BorderLayout());
            model = new DefaultListModel<>();
            list = new JList(model);
            add(new JScrollPane(list));
            EventPane eventPane = new EventPane();
            eventPane.addConnectionListener(this);
            add(eventPane, BorderLayout.SOUTH);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.dispose();
        }

        @Override
        public void connectionEstablished(ConnectionEvent evt) {
            model.addElement(DateFormat.getDateTimeInstance().format(evt.getDate()));
        }
    }

    public class EventPane extends JPanel {

        private List listeners;
        private JButton update;

        public EventPane() {
            listeners = new ArrayList<>(5);
            setLayout(new GridBagLayout());
            update = new JButton("Update");
            update.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
//                    connectionEstablished(new Date());
                    fireConnectionEstablished(new Date());
                }
            });
            add(update);
        }

        public void addConnectionListener(ConnectionListener listener) {
            listeners.add(listener);
        }

        public void removeConnectionListener(ConnectionListener listener) {
            listeners.remove(listener);
        }

        protected ConnectionListener[] getConnectionListeners() {
            return listeners.toArray(new ConnectionListener[listeners.size()]);
        }

        protected void fireConnectionEstablished(Date date) {
            ConnectionListener[] listeners = getConnectionListeners();
            if (listeners != null && listeners.length > 0) {
                ConnectionEvent evt = new ConnectionEvent(date);
                for (ConnectionListener listener : listeners) {
                    listener.connectionEstablished(evt);
                }
            }
        }

    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X