2012-09-24 3 views
5

우선, 테이블 셀의 렌더링에 관한 것이 아니라, 이것에 대해 먼저 말해 두어야한다.JTable 행에 커스텀 오브젝트를 설정하는 방법

여기 내 DB에 User 개체를 기반으로하는 2D 배열을 사용하여 작성한 TableModel이 있습니다.

List<User> userList = userManagerService.getAllUsers(); 

    /* String[] col_user = {"Username", "Name", "Phone", .... } */ 
    String[][] data = new String[userList.size()][col_user.length]; 
    int i = 0; 
    for (User user : userList) { 
     String[] userdata = new String[col_user.length]; 
     userdata[0] = user.getUserUsername(); 
     userdata[1] = user.getUserName(); 
     userdata[2] = user.getUserPhone(); 
     userdata[3] = user.getUserNic(); 
     userdata[4] = user.getUserAddress(); 
     userdata[5] = user.getUserEmail(); 

     data[i++] = userdata; 
    } 

    VstTableItemModel tiModel = new VstTableItemModel(data, col_user); 
    dataTable.setModel(tiModel); 

내 문제는 내가 테이블에서 선택된 행을 사용하여, 다시 User 개체를 얻을 수있는 방법이다. 새 User 개체를 만들고 행 데이터로 채울 수는 없습니다. 질문 된 User 개체 (개체는 userList)를 가져와야합니다. 그렇다면 테이블 행이있는 객체를 설정하는 방법은 무엇입니까?

여기 내 VstTableItemModel 클래스입니다. 예를 들어 당신이 모델을 만들기 전에 User 객체까지이 모델에 직접 추가 한 모델이 당신을 위해 일을 할 수 있도록하는 대신 분할의

public class VstTableItemModel extends AbstractTableModel { 

    ArrayList<Object[]> data; 
    String[] header; 

    public VstTableItemModel(Object[][] obj, String[] header) { 
     this.header = header; 
     data = new ArrayList<Object[]>(); 

     for (int i = 0; i < obj.length; ++i) { 
      data.add(obj[i]); 
     } 
    } 

    @Override 
    public int getRowCount() { 
     return data.size(); 
    } 

    @Override 
    public int getColumnCount() { 
     return header.length; 
    } 

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
     return data.get(rowIndex)[columnIndex]; 
    } 

    @Override 
    public String getColumnName(int index) { 
     return header[index]; 
    } 

} 
+0

'VstTableItemModel'을 (를) 수정할 수 있습니까? – MadProgrammer

+0

예. 내가 여기에 게시해야합니까? – shan

+0

아니요, 더 쉽게 만들 수 있습니다;) – MadProgrammer

답변

13

...

public class VstTableItemModel extends AbstractTableModel { 

    private List<User> users; 

    public VstTableItemModel(List<User> users) { 

     this.users = new ArrayList<User>(users); 

    } 

    @Override 
    public int getRowCount() { 
     return users.size(); 
    } 

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

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 

     Object value = "??"; 
     User user = users.get(rowIndex); 
     switch (columnIndex) { 
      case 0: 
       value = user.getUserUsername(); 
       break; 
      case 1: 
       value = user.getUserName(); 
       break; 
      case 2: 
       value = user.getUserPhone(); 
       break; 
      case 3: 
       value = user.getUserNic(); 
       break; 
      case 4: 
       value = user.getUserAddress(); 
       break; 
      case 5: 
       value = user.getUserEmail(); 
       break; 
     } 

     return value; 

    } 

    @Override 
    public Class<?> getColumnClass(int columnIndex) { 
     return // Return the class that best represents the column... 
    } 

    /* Override this if you want the values to be editable... 
    @Override 
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 
     //.... 
    } 
    */ 

    /** 
    * This will return the user at the specified row... 
    * @param row 
    * @return 
    */ 
    public User getUserAt(int row) { 
     return users.get(row); 
    } 

} 

이렇게하면

List<User> userList = userManagerService.getAllUsers(); 
VstTableItemModel tiModel = new VstTableItemModel(userList); 

... 지금 같은 것을 할 수 있어야 필요한 경우 ... 특정 행을 나타내는 사용자를 움켜 잡을 수 있습니다 ...

User user = tiModel.getUserAt(rowIndex); 
+0

감사합니다. 하지만, 내가 그것을 정렬하면 어떻게 될 것인가? 그런 다음 행 인덱스가 변경됩니다. 안 그래? – shan

+0

'JTable'의 정렬 API를 사용한다면 간단히'JTable '을 사용할 수 있습니다. 뷰의 ('JTable') 행 인덱스를 모델 인덱스로 변환하려면 convertRowIndexToModel을 사용하십시오. – MadProgrammer

+0

감사합니다. 이것은 내가 원하는 솔루션입니다. 다시 감사드립니다 ... – shan

관련 문제