Проблемы с обновлением моего JList для активных каналов - PullRequest
0 голосов
/ 23 января 2012

Введение:

Я создал чат-программу, в которой клиент подключается к серверу. Клиент может присоединяться к каналам, и когда они это делают, jList (см. Код) должен обновляться через DefaultListModel с помощью (getChannel ()) и должен показывать всех других клиентов, подключенных к тому же каналу. Я знаю getChannel (); работает, так как я отладил его (и использовать systemoutprint). У меня уже есть Jlists для активных каналов и пользователей online, который работает! :)

Клиенты используют методы обратного вызова для уведомления других клиентов, подключенных к серверу.

Я провел некоторую отладку и много раз пытался просмотреть свой код.

Вот код:

Сервер:

private Hashtable<String, ArrayList<String>> channels = new Hashtable<String, ArrayList<String>>();

public void connectChannel(String username, String channel) throws RemoteException{ 
    setUsername(username);
    if(isUserRegistered(username)){ 
        if (!channels.containsKey(channel)) {
            String message = "User " + username + " entered the channel";
            channels.put(channel, new ArrayList<String>());
            channels.get(channel).add(username);
            notifyChannelSystem(channel, "SYSTEM", message);
            notifySelf(username, "Write /? for avaliable commands");
            System.out.println("User " + username + " connected to channel " + channel + " which was created");
        }
        else{
            if(channels.get(channel).contains(username)){ 
                notifySelf(username, "Place in channel " + channel);
                System.out.println("User " + username + " connected to channel " + channel + " which the user was already in");
            } 
            else {
                channels.get(channel).add(username);
                String message = "User " + username + " just entered the channel";
                notifyChannelSystem(channel, "SYSTEM", message);   
                System.out.println("User " + username + " connected to channel " + channel + " which was already created by someone else");
          }
        }
    }
            updateJListForActiveChannels();
            updateJListForUsersInChannel();
}

@Override
public ArrayList<String> getUsersInChannel(String channel) throws RemoteException{
    return channels.get(channel);   
}

@Override
public void updateJListForUsersInChannel() throws RemoteException{
    for(Client c : clients){
        c.getJListForUsersInChannel();
    }
}

GUILogic:

DefaultListModel usersInChanDLM = new DefaultListModel();

public ArrayList<String> getUsersInChannel(String channel) throws RemoteException{
    return cf.getUsersInChannel(channel);
}

public DefaultListModel getUsersInChannelAsDefaultListModel(String channel) throws RemoteException{
    if(!(getChannel() == null)){
        for(String a : cf.getUsersInChannel(getChannel())){
            usersInChanDLM.addElement(a);
        }
    }
    return usersInChanDLM;
}

void updateUsersInChannelJlist(JList jList3) throws RemoteException {
    usersInChanDLM.clear();
    for(Client c : cf.getClients()){
        if(!(usersInChanDLM.contains(c.findName()))){
            usersInChanDLM.addElement(c.findName());
        }
    }
    jList3.setModel(usersInChanDLM);
}

GUI: JList:

usersInChannelJList = new javax.swing.JList();
try{
usersInChannelJList.setModel(gl.getUsersInChannelAsDefaultListModel(gl.getChannel()));

usersInChannelJList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
}catch(RemoteException ex){
    System.out.println(ex);
}
jScrollPane4.setViewportView(usersInChannelJList);

Интерфейсы:

Сервер:

    void updateJListForUsersInChannel() throws RemoteException;

Клиент:

    void getJListForUsersInChannel() throws RemoteException;

**

Проблема:

**

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

public ArrayList<String> getUsersInChannel(String channel) throws RemoteException{
        return channels.get(channel);   
    }

я хочу получить массив со всеми пользователями из выбранного канала. Есть ли простой способ сделать это с помощью хеш-таблицы каналов?

...