Введение:
Я создал чат-программу, в которой клиент подключается к серверу. Клиент может присоединяться к каналам, и когда они это делают, 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);
}
я хочу получить массив со всеми пользователями из выбранного канала. Есть ли простой способ сделать это с помощью хеш-таблицы каналов?