Java 消除帧间不必要的焦点变化

Java 消除帧间不必要的焦点变化,java,swing,jframe,focus,Java,Swing,Jframe,Focus,好的,问题是,我正在写一个简单的聊天程序。客户端有一个名为ChatList的JFrame类,该类包含一个显示在线用户的JList。使用以下方法每隔2秒刷新一次列表,其中包含用户的新状态: public void refresh(ArrayList<String> onlineUsers) { System.out.println(onlineUsers); DefaultListModel listModel2 = new DefaultListModel();

好的,问题是,我正在写一个简单的聊天程序。客户端有一个名为
ChatList
JFrame
类,该类包含一个显示在线用户的
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);    
    }
公共无效刷新(ArrayList onlineUsers){
System.out.println(在线用户);
DefaultListModel listModel2=新的DefaultListModel();
对于(int i=0;i
如果用户选择与之聊天的客户端,则会打开另一个
JFrame
。问题是这个
JFrame
无法保持焦点,焦点在
ChatList
ChatWindow
之间交替摆动,这导致用户甚至没有足够的时间来写一个简单的“Hello”。现在我有两个问题:

  • 是因为更新了我的jlist吗
  • 有没有办法阻止这种情况的发生,让
    聊天列表
    只在我点击它时获得焦点,而不是通过更新它

如果要更改聊天列表中的用户,则只需更新列表模型。然后,模型将通知JList数据已更改,JList将重新绘制自身,但不应将焦点从当前活动窗口移开

我认为以下任何代码都不是必需的:

listbox.validate();

topPanel.add(listbox, BorderLayout.CENTER);
this.setVisible(true);    

你试过这些吗?你的_frame.toFront();您的_frame.toBack();您的_frame.setEnabled(False)@Arijit是的,我尝试了后者,但不起作用,我还为另一个帧调用了requestFocus(),但也不起作用:(请参见
listbox.validate();
是必需的,但您是对的问题是
this.setVisible(true);
@Peggy,没有验证()不需要。ListModel负责在模型更改时通知JList,JList将重新绘制自身。如果您认为需要该方法,则您的程序在某个地方仍然存在问题。@作出相同的声明不会解决问题或提供任何更多信息。所有更新都应在d必须在事件调度线程上执行代码。然后JList将重新绘制自身。您不需要创建新的JList或将JList添加到GUI,因为它已添加到GUI。发布一个演示问题的
SSCCE