我有一个JList
连接到一个集合。
当集合发生变化时,我需要自动刷新JList
。但我可以看到,JList
仅在我最小化(或最大化)JFrame
后才会刷新。
为什么?
我是Java新手,我正在努力学习。
我有这个列表模型的集合:
public class UserCollection extends Vector<User> implements ListModel{
private static final long serialVersionUID = 2668410577023194442L;
@Override
public void addListDataListener(ListDataListener arg0) {
System.out.println("add list! --- " +arg0.toString());
}
@Override
public Object getElementAt(int index) {
return this.get(index).getName();
}
@Override
public int getSize() {
return(this.elementCount);
}
@Override
public void removeListDataListener(ListDataListener arg0) {}
}
在另一个课程中,我使用userList.add(u1);
或userList.remove(u1);
在JFrame
课程中我有:
JList list = new JList();
list.setModel(xmppManager.userList);
我可以在控制台上看到收集更改,如果我最小化JFrame
和/或最大化,JList
会正确刷新...
答案 0 :(得分:1)
收集更改后,请在JList上调用刷新:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
jlist.revalidate(); // triggers a repaint of all the items in the JList.
jlistContainer.repaint(); // Not sure if this one is needed
}
});
您的JList模型如何更新?
[编辑]现在我们有了你的代码,你应该看看AbstractListModel并以相同的方式实现你的模型,或者更好,扩展AbstractListModel。
实际上,您将数据添加到集合中,但模型未通知此更改!
答案 1 :(得分:1)
如果可以的话,我建议您使用DefaultListModel作为JList的模型。该模型将在模型更改时自动更改视图(JList),并使您的生活更轻松。如果你绝对必须使用自己制作的集合,那么看看你是否可以让持有它的类扩展AbstractListModel。如果这样做,请确保在更改模型中的数据时调用相应的fireXXXX()方法。
答案 2 :(得分:0)
使用add和remove方法添加或删除项目时,您正在调用Vector中的方法。这更新了您的模型,但实际的JList无法知道模型已更新并且需要刷新自己。
(我认为其他人已经充分解释了如何解决问题)
答案 3 :(得分:0)
最后,由于你的帮助,我已经解决了这个问题!
这就是我所做的:
1)在上课时,我有
public DefaultListModel userList;
我用userList.addElement(user)
和userList.removeElement(user)
2)在JFrame
课程中,我有:
JList list = new JList();
list.setCellRenderer(new UsersRenderer());
list.setModel(xmppManager.userList);
3)这是我的UsersRenderer
:
import java.awt.Color;
import java.awt.Component;
import javax.swing.*;
public class UsersRenderer extends javax.swing.JPanel implements ListCellRenderer {
/**
*
*/
private static final long serialVersionUID = -9210143012283239644L;
public UsersRenderer() {
initComponents();
}
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
User person = (User) value;
labelUser.setText(person.getName() + " " + person.getAddress());
if (isSelected) {
setBackground(Color.red);
setForeground(Color.white);
} else {
setBackground(Color.white);
setForeground(Color.black);
}
return this;
}
private void initComponents() {
labelUser = new javax.swing.JLabel();
labelUser.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
labelUser.setText("testo");
add(labelUser);
}
private javax.swing.JLabel labelUser;
}