хорошо, вот проблема, я пишу простую программу чата. у клиента есть JFrame
называемый классом ChatList
который содержит JList
который показывает онлайн-пользователей. Этот список обновляется с новым статусом пользователей каждые 2 секунды, используя этот метод:
public void refresh(ArrayList<String> onlineUsers) {
System.out.println(onlineUsers);
DefaultListModel listModel2 = new DefaultListModel();
for (int i = 0; i < onlineUsers.size(); i++) {
if (!onlineUsers.get(i).equals(client.userName))
listModel2.addElement(onlineUsers.get(i));
}
if (!listModel2.equals(listModel)) {
listModel=listModel2;
listbox.setListData(listModel.toArray());
listbox.validate();
}
topPanel.add(listbox, BorderLayout.CENTER);
this.setVisible(true);
}
если пользователь выбирает клиента для чата, открывается другой JFrame
. Проблема в том, что этот JFrame
будет содержать фокус, а фокус будет альтернативно ChatList
между ChatList
и ChatWindow
, что заставляет пользователя не иметь достаточно времени, чтобы даже написать простой "Hello". так что теперь у меня есть 2 вопроса:
ChatList
получить фокус, когда я нажимаю на него, а не обновляю его?Если вы хотите изменить пользователей в ChatList, то все, что вам нужно сделать, это обновить ListModel. Затем модель уведомит JList о том, что данные изменились, и JList перекрасит себя, но не должен отвлекаться от текущего активного окна.
Я не думаю, что любой из следующих кодов необходим:
listbox.validate();
topPanel.add(listbox, BorderLayout.CENTER);
this.setVisible(true);
listbox.validate();
необходимо, но вы были правы, проблема была в этом this.setVisible(true);