Обновление JList - PullRequest
       3

Обновление JList

3 голосов
/ 17 января 2012

Я сейчас создал JList, который основан на массиве списков и заполняется моделью defaultlist.Список добавит людей, когда они подключатся к серверу, но он не покажет того, кто подключается, или тех, кто подключается после.Итак, я должен обновить JList.

Мой вопрос:

Что я должен обновлять?Можно ли использовать таймер, который запускает обновление, или я должен реализовать метод обновления, который запускается, когда кто-то входит на сервер?

ps.Это чат-сервер, очень похожий на IRC.

Вот часть кода:

GUI:

jList2 = new javax.swing.JList();
try{
jList2.setModel(gl.getUsersOnlineAsDefaultListModel(gl.getClients())
    );
}catch(RemoteException ex){
    System.out.println(ex);
}
jScrollPane3.setViewportView(jList2);

Логика графического интерфейса:

public DefaultListModel getUsersOnlineAsDefaultListModel(ArrayList<Client> clients) throws RemoteException {
DefaultListModel result = new DefaultListModel();
for(Client c : clients){
    result.addElement(c.findName());
}
    return result;
}

    public ArrayList<Client> getClients() throws RemoteException, NullPointerException{
            return cf.getClients();
    }

Серверная часть:

ArrayList clients = new ArrayList<Client>();

public ArrayList<Client> getClients(){
    return clients;          
}

Ответы [ 3 ]

3 голосов
/ 17 января 2012

Я думаю, что лучший способ сделать это - реализовать прослушиватель, запускаемый событием, когда клиент попадает на сервер, который обновляет JList.

3 голосов
/ 17 января 2012

Качели однопоточные;Вы должны согласиться с тем, что все изменения в графическом интерфейсе Swing должны выполняться на EventDispatchThread , включая обновления на XxxListModel.Ваш код показывает RemoteXxx, затем вы вызываете потенциально долго работающий поток из некоторого из Listeners или (как вы просили) из Timer.В основном у вас есть два варианта:

1) Реализовать необходимые методы SwingWorker: publish(), вызываемые на фоне htread, и process() и `done (), вызываемые наEDT.

2) Обернуть выполнение в Runnble#Thread, но тогда все выходные данные в GUI должны быть обернуты в invokeLater / invokeAndWait, включая потоковые методы setText и т. Д.

3 голосов
/ 17 января 2012

Что я должен обновлять?

Модель списка (DefaultListModel), предоставляющая содержимое JList.

Можно ли использовать таймер, который запускает обновление, или я должен внедрить метод обновления, который запускается при входе на сервер?

Второй вариант звучит лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...