2011-09-27 3 views
4

일부 화면 코딩을위한 프리젠 테이션 모델 패턴을 따릅니다.목록을 바인딩하는 방법 (한 번 이상)?

  • 나는, 나는 JTable이 목록의 내용을 표시 할 것 ArrayList
  • 에 나는 또한 콤보에서이 목록에서 일부 레코드를 표시하려는 AbstractTableModel
  • 덕분에 약간의 콩을 저장 동시에
  • 이 세 가지 화면 (및 모델)에서하는 JList, 에서 (형태) 상자 및 일부 다른 독립적 인 F입니다 롬 서로

어떻게 관리 할 수있는 추가 {하나 이상의}/사방에 "실시간"내 목록 및보기 변경에 {하나 이상을} 제거?

나는 내 ObservableList를 작성하려고하거나 EventDispatcher 주위에 구현하려고합니다. 어떻게 생각하십니까?


PS :

  • 내가 C 번호에 BindingList 자바에 대해, 그 목적을 위해 무엇을 할 수 있는지 알아?
  • PropertyChangeSupport 덕분에 각 빈의 업데이트를 이미 표시 할 수 있습니다.
+3

당신은 모양 JGoodies 바인딩해야, 그것은 PresentationModel 패턴을 기반으로하고 문제를 맞아야합니다 .. – jfpoilpret

답변

4

AbstractTableModelListModel을 구현하고 JComboBox and JList와 함께 사용할 수 있습니다. 필요한 경우 메서드를 기본 모델 구현에 전달할 수 있습니다.

부록 : How to Use Tables에 언급 된 SharedModelDemo은 사용자가 시작할 수있는 예입니다. 그것은 extends DefaultListModel implements TableModel입니다.해야 할 일도 있습니다. extends AbstractTableModel implements ListModel

부록 : 참고로 다음은 최소 구현 및 3 가지 테스트 인스턴스화의 개요입니다. 기본 콤보 및 목록 구현을 사용했지만 필요한 경우 해당 추상 구현을 사용할 수 있습니다.

public class SharedModel extends AbstractTableModel 
     implements ComboBoxModel, ListModel { 
    private ComboBoxModel comboModel = new DefaultComboBoxModel(); 
    private ListModel listModel = new DefaultListModel(); 

    //ComboBoxModel 
    @Override 
    public void setSelectedItem(Object anItem) { 
     comboModel.setSelectedItem(anItem); 
    } 

    @Override 
    public Object getSelectedItem() { 
     return comboModel.getSelectedItem(); 
    } 

    // ListModel 
    @Override 
    public int getSize() { 
     return listModel.getSize(); 
    } 

    @Override 
    public Object getElementAt(int index) { 
     return listModel.getElementAt(index); 
    } 

    @Override 
    public void addListDataListener(ListDataListener l) { 
     listModel.addListDataListener(l); 
    } 

    @Override 
    public void removeListDataListener(ListDataListener l) { 
     listModel.removeListDataListener(l); 
    } 

    // TableModel 
    @Override 
    public int getRowCount() { 
     return 0; 
    } 

    @Override 
    public int getColumnCount() { 
     return 0; 
    } 

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
     return null; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       SharedModel sm = new SharedModel(); 
       JTable table = new JTable(sm); 
       JList list = new JList(sm); 
       JComboBox check = new JComboBox(sm); 
      } 
     }); 
    } 
} 
+0

나는 너의 대답을 좋아한다! 귀하의 충고는 일종의 "스위스 나이프"모델을 구현하는 것입니다. 그러나이 공유 모델을 각 스크린을 대표하는 각 하위 모델에 주입해야합니까? 그렇다면 각 화면이 별도의 모듈로 개발되므로 다른 솔루션을 찾아야합니다. "ListModel like"('ObservableList')를 하위 레벨 (javax.swing에 대한 의존성이없는 별도의 모듈)에 구현하고 모든 스크린과 공유한다면 어떻게 될까요? 이와 같이 모든 하위 모델은 추가/제거/업데이트 알림을 수신 할 수 있습니까? – Destroyica

+0

나는 내가 이해할 지 모르겠다. 공유 모델은 임의의 수의 청취 뷰를 가질 수 있습니다. 'AbstractListModel'은'JTable'을위한'AbstractTableModel'처럼'JList' 또는'JComboBox'에 대한 이벤트 핸들링을 제공 할 수 있습니다. 귀하의 데이터 모델은 계층 적입니까? – trashgod

+0

나는 충분히 명확하지 않다면 사과한다. 그래서, 제 관심은 각 화면과 각자의 모델을 분리하는 것입니다. 내 마음 속에서,'JTable'이있는 화면이 있다면 JTable을 "피드"하기 위해'AbstractTableModel'을 확장해야합니다. 동일한 데이터를 보여주는 JList가있는 다른 화면이있는 경우 전용 'AbstractListModel'을 확장합니다. 낮은 레벨에서,'AbstractTableModel'과'AbstractListModel'는 같은 "Observable List"(완전히 스윙으로부터 분리됨)에있는 이벤트를 듣습니다 .... 아마 내가 잘못 알고 있습니다. - 아니요, 제 데이터 모델은 계층 구조가 아닙니다. – Destroyica

2

JComboBox 및 JList의 경우 subList() 메서드를 사용하여 ArrayList의 섹션을 간단히 참조 할 수 있습니다. 이것은 ArrayList 내에서 시작 및 끝 위치를 쉽게 식별 할 수 있고 필요한 요소가 순차적 일 경우 작동합니다.

상황이 좀 더 동적 인 경우 생성자에서 ArrayList를 가져온 사용자 지정 목록 클래스를 구현 한 다음 적절한 논리를 반환해야하는 논리를 적용 할 수 있습니다.

+0

효과적으로, 상황은 더 역동적이다 : 내 JList의의 내 콤보 상자 변화의 내용을보고 싶어 "실시간", 심지어 그 이상 : 각 항목의 내용은 동적으로 업데이트되어야합니다. subList()를 사용하는 것이 좋지만 항목을 제거하면 어떻게됩니까? 내 원래 목록이 변경되지만 JTable은 알림을받지 않으며'fireTableRowsDeleted'를 발생시키지 않습니다. – Destroyica

관련 문제