Java JList仅在最小化或最大化后刷新

时间:2011-02-11 20:54:30

标签: java swing jlist

我有一个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会正确刷新...

4 个答案:

答案 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;  
}