2011-02-11 35 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; 
}