2011-02-11 2 views
2

컬렉션에 JList이 연결되어 있습니다. 컬렉션이 변경되면 JList이 자동으로 새로 고쳐 져야합니다. 그러나 JListJFrame을 최소화 (또는 최대화) 한 후에 만 ​​새로 고침됩니다.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) {} 

} 

을, 나는 내가 가지고있는 JFrame 클래스에서 userList.add(u1); 또는 userList.remove(u1);

와 컬렉션을 채우는 :

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

콘솔에서 컬렉션이 변경되는 것을 볼 수 있으며, 내가 JFrame을 최소화하거나 최대화하면당신의 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 
    } 
    }); 

업데이트됩니다 방법 :은

컬렉션이 변경되면
+0

"컬렉션에 연결됨"이란 무엇을 의미합니까? 핵심은 JList의 모델을 유지 관리하고 변경하는 방법입니다. 적절한 모델을 변경하면 JList가 자동으로 변경됩니다. 코드를 보여줄 수 있습니다. –

+0

코드로 업데이트 ... 고맙습니다. 죄송합니다. 저는 자바에서 새로 왔고 배우려고합니다. – Laphroaig

답변

1

, 당신의 JList에 새로 고침을 호출 ... 제대로 새로 고쳐?

[편집] 이제 코드를 작성 했으므로 AbstractListModel을 살펴보고 같은 방식으로 모델을 구현하거나 더 나은 방법으로 AbstractListModel을 확장해야합니다.

실제로 컬렉션에 데이터를 추가했지만 모델에이 변경 사항이 통지되지 않습니다.

+1

모델이 올바르게 갱신 된 경우 JList를 "새로 고"할 필요가 없습니다. –

+0

JList에 표시된 항목에 따라 다릅니다. 예를 들어 커스텀의 ListCellRenderer를 사용해 커스텀 JPanel를 JList에 추가 할 수 있습니다. 이 경우 JPanel은 자동으로 다시 그려지지 않습니다. – JPelletier

+0

방금 ​​첫 번째 게시물을 코드로 업데이트했습니다 ... 감사합니다! – Laphroaig

1

가능한 경우 JList 모델로 DefaultListModel을 사용하는 것이 좋습니다. 이 모델은 모델이 변경 될 때 뷰 (JList)의 변경을 자동화하고 여러분의 삶을 훨씬 쉽게 만듭니다. 절대적으로 자신 만의 컬렉션을 사용해야한다면, 보유하고있는 클래스를 가질 수 있는지, AbstractListModel을 확장 할 수 있는지 확인하십시오. 이 작업을 수행 할 경우 모델에서 데이터를 변경할 때마다 적절한 fireXXX() 메서드를 호출해야합니다.

+0

안녕, 난 모음을 사용하고 있습니다 : 공공 객체 getElementAt (INT 지수) { \t \t 반환을 ""+ 썩 (인덱스). getName(); \t \t – Laphroaig

+0

AbstractListModel을 시도하고 있지만 "AbstractListModel을 유형으로 확인할 수 없습니다." – Laphroaig

+0

코드가 주석으로 잘 표시되지 않으므로 원본 게시물을 편집하여 코드 정보를 게시하십시오. 또한 위의 진술로 무엇을 의미하는지 설명하십시오. JList에 이미지를 표시하려면 사용자 정의 ListCellRenderer (자세한 내용은 자습서 참조)를 사용하고 DefaultListModel 객체를 사용하여 데이터를 보유 할 수 있습니다. –

0

add 및 remove 메서드를 사용하여 항목을 추가하거나 제거 할 때 Vector의 메서드를 호출했습니다. 이 모델은 업데이트되었지만 실제 JList에서는 모델이 업데이트되었고 자체를 새로 고쳐야한다는 것을 알 수 없었습니다.

0

마지막으로 당신의 도움이 덕분에 해결 한 (나는 다른 사람들이 적절하게 문제를 해결하는 방법을 설명했다 생각)!

이 내가 무슨 짓을 : 클래스에서

1)이 일을 내가

public DefaultListModel userList; 

을 가지고 있고 나는 JFrame 클래스 userList.addElement(user)userList.removeElement(user)

2)로 채우, 나는 가지고있다 :

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

3) 그리고 이것은 i이다. 내 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; 
}