избавиться от нежелательной смены фокуса между кадрами

1

хорошо, вот проблема, я пишу простую программу чата. у клиента есть 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 вопроса:

  • это из-за обновления моего jlist?
  • есть ли способ остановить это и заставить ChatList получить фокус, когда я нажимаю на него, а не обновляю его?
  • 0
    ты пробовал с любым из них? Your_frame.toFront (); Your_frame.toBack (); Your_frame.setEnabled (False);
  • 0
    @Arijit да, я попробовал последнее, которое не работало, я также вызвал requestFocus () для другого кадра, но это тоже не сработало :(
Показать ещё 1 комментарий
Теги:
swing
focus
jframe

1 ответ

1
Лучший ответ

Если вы хотите изменить пользователей в ChatList, то все, что вам нужно сделать, это обновить ListModel. Затем модель уведомит JList о том, что данные изменились, и JList перекрасит себя, но не должен отвлекаться от текущего активного окна.

Я не думаю, что любой из следующих кодов необходим:

listbox.validate();

topPanel.add(listbox, BorderLayout.CENTER);
this.setVisible(true);    
  • 0
    listbox.validate(); необходимо, но вы были правы, проблема была в этом this.setVisible(true);
  • 0
    @Peggy, нет validate () не нужен. ListModel отвечает за уведомление JList об изменении модели и перерисовывании JList. Если вы думаете, что вам нужен этот метод, то у вас все еще есть проблемы с вашей программой.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню