2011-02-11 32 views
2

我有一个JList连接到一个集合。 收集更改时,我需要自动刷新JList。但我可以看到,只有在最小化(或最大化)JFrame后,我的JList才会刷新。Java JList刷新后才能最小化或最大化

为什么?

我是新来的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 I类有:

JList list = new JList(); 
list.setModel(xmppManager.userList); 

我可以在控制台上看到更改的集合,如果我最小化了JFrame和/或最大化,JList正确刷新...

+0

你是什么意思的“连接到集合”?关键是你如何保持和改变JList的模型?如果您更改适当的模型,则JList应该自动更改。您可能想要显示代码。 – 2011-02-11 20:57:55

+0

我更新了代码...谢谢你,对不起,我是新的Java,我正在努力学习。 – Laphroaig 2011-02-11 21:15:08

回答

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

如果模型更新正确,应该不需要“刷新”JList。 – 2011-02-11 21:03:50

1

如果可以,我建议你使用DefaultListModel作为JList的模型。这个模型会在模型改变时自动改变视图(JList),并且会让你的生活变得更容易。如果你绝对必须使用你自己制作的集合,那么看看你是否可以让拥有它的类扩展AbstractListModel。如果你这样做,每当你改变模型中的数据时,一定要调用适当的fireXXXX()方法。

0

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

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

0

最后我已经解决了这个感谢您的帮助!

这是我做过什么:

1)在课堂上做的工作,我有

public DefaultListModel userList; 

和我一起在JFrameuserList.addElement(user)userList.removeElement(user)

2)填充它,我有:

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