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

Java JList仅在最小化或最大化后刷新,java,swing,jlist,Java,Swing,Jlist,我有一个JList连接到收藏。 当集合更改时,我需要自动刷新JList。但是我可以看到,我的JList只有在最小化(或最大化)了JFrame之后才会刷新 为什么? 我是Java新手,我正在努力学习 我有以下列表模型的集合: public class UserCollection extends Vector<User> implements ListModel{ private static final long serialVersionUID = 266841057702319

我有一个
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) {}

}

我可以在控制台上看到收藏的变化,如果我最小化
JFrame
和/或最大化,则
JList
会正确刷新…

一旦收藏发生变化,请在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


实际上,您将数据添加到集合中,但模型不会收到此更改的通知

如果可以,我建议您使用DefaultListModel作为JList的模型。此模型将随着模型的更改而自动更改视图(JList),并使您的生活更加轻松。如果您必须使用自己创建的集合,那么请查看是否可以让保存它的类扩展AbstractListModel。如果执行此操作,请确保在更改模型中的数据时调用相应的fireXXXX()方法。

当您使用add和remove方法添加或删除项时,您正在调用Vector中的方法。这更新了您的模型,但实际的JList无法知道模型已更新,并且需要刷新自身


(我想其他人已经充分解释了如何解决这个问题)

多亏了你的帮助,我终于解决了这个问题

这就是我所做的:

1) 在班上做我的作业

public DefaultListModel userList;
我用
userList.addElement(用户)
userList.removelement(用户)

2) 在
JFrame
类中,我有:

JList list = new JList();
list.setCellRenderer(new UsersRenderer());
list.setModel(xmppManager.userList);
3) 这是我的
用户推荐人

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

“连接到收藏”是什么意思?关键是如何维护和更改JList的型号?如果您更改了相应的型号,JList将自动更改。你可能想显示代码。我用代码更新了。。。谢谢,抱歉,我是java新手,正在尝试学习。如果模型更新正确,则无需“刷新”JList。这取决于JList中显示的项目。例如,可以使用自定义ListCellRenderer将自定义JPanel添加到JList。在这种情况下,您的JPanel将不会自动重新绘制。我同意气垫船。。如果模型被正确更新,并且模型触发了相应的事件,并且代码在EDT上执行,那么列表将重新绘制自身。嗨,我使用collection是因为下一步我将在getElementAt中返回自定义html格式的文本,例如:公共对象getElementAt(int index){return”“+this.get(index).getName();}我正在尝试AbstractListModel,但我有“AbstractListModel无法解析为类型”的问题,请将您的代码信息以编辑方式发布到原始帖子中,因为代码不能很好地显示为注释。另外,请解释你上述陈述的意思。如果您想在JList中显示图像,那么您可以使用自定义ListCellRenderer(查看教程了解更多信息),并且仍然可以使用DefaultListModel对象来保存数据。关于AbstractListModel,如果您有错误,请再次编辑您的原始帖子,显示您的新代码尝试和实际错误消息。好的,非常感谢。我试试看。对不起,我是新来的,因为我的名声不好,不能给你投票。
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;  
}