2012-03-25 2 views
6

나는 DefaultListModel을 사용하는 JList를 가지고있다.자바 - 개체를 변경 한 후 JList 업데이트

그런 다음 모델에 값을 추가 한 다음 JList에 표시합니다. 마우스 더블 클릭하면 사용자가 선택한 사람의 현재 사용자 번호를 편집 할 수있는 MouseListener를 만들었습니다.

해당 레코드의 실제 개체가 변경되고 있다는 것을 확인했습니다. 내가 가지고있는 유일한 문제는 실제 Jlist를 업데이트하여 해당 객체의 새 값을 표시하는 것입니다. 내가 가지고있는 현재 코드의

조각은 다음과 같습니다

만들기의 JList와의 DefaultTableModel :

m = new DefaultListModel(); 
m.addListDataListener(this); 
jl = new JList(m); 
jl.addMouseListener(this); 

개체 업데이트 :

String sEditedNumber = JOptionPane.showInputDialog(this, "Edit number for " + name, number); 
if (sEditedNumber != null) { 
    directory.update (name, sEditedNumber); 
} 

과 (때 JL JList이며 m은 DefaultTableModel입니다.)

public void contentsChanged(ListDataEvent arg0) { 
     jl.setModel(m); 
    } 
+1

[ListSelectionListener] 대신 [MouseListener]를 사용하는 이유는 무엇입니까? (http://docs.oracle.com/javase/tutorial/uiswing/events/listselectionlistener.html)? – trashgod

답변

3

당신은의 ListModel에 fireContentsChanged()를 호출해야합니다.

+0

DefaultListModel에서이 작업을 수행 할 수 있습니까? – mino

+0

@ M92 : DefaultListModel이 AbstractListModel에서 확장 된 이후로는 어떨까요? –

+0

그러나 이것을 구현하는 방법을 모르겠다. 지침을 얻을 수 있을까? 나는 그것을 작동시키는 것처럼 보일 수 없다. 어디에서 추가 할 것인가? JList를 업데이트하는 데 어떻게 사용합니까? 제공된 링크를 사용하려고하지만 멀리 가지 않습니다. – mino

11

대신 setElementAt()과 같은 DefaultListModel 방법 중 하나를 사용하여 기존 모델을 업데이트하십시오 (fireContentsChanged()).

+0

[* 목록 사용 방법 *] (http://docs.oracle.com/javase/tutorial/uiswing/components/list.html)도 참조하십시오. – trashgod

0

DefaultListModel.fireContentsChanged()으로 전화해야합니다. 그러나이 방법은 보호되어 있으므로 (왜 그렇게 생각하는지 궁금합니다.) 직접 할 수는 없습니다. 당신이 '돈 경우, 또는 m.update(theIndex);

:

class MinoListModel<T> extends DefaultListModel<T> 
{ 
    public void update(int index) 
    { 
     fireContentsChanged(this, index, index); 
    } 
} 

이 목록의 모델로 사용 대신, 작은 서브 클래스 수 있도록 사용자 수를 업데이트 한 후

m = new MinoListModel<>(); 
jl = new JList(m); 

를 해당 항목을 업데이트 하위 클래스가 필요하면 사용자 번호가 변경된 후에 JList 요소를 바꿀 수 있습니다 (m.setElementAt(theSameElement, theIndex);). 이것은 다소 성가시고 하위 클래스를 갖는 것이 더 깨끗한 접근 방법입니다.