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吗
- 有没有办法阻止这种情况的发生,让
只在我点击它时获得焦点,而不是通过更新它聊天列表
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
。