2012-09-24 61 views
5

设置自定义的对象,我应该先告诉这个,这是不是渲染表格单元格。如何JTable中排

下面是我使用基于我在DB一个User物体上的二维数组建设的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对象)。那么,他们有没有办法用表格行来设置Object?

这是我VstTableItemModel类。

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

而是分裂的User对象了创建模型之前,直接将它添加到模型中,并允许模型做的工作你...

例如

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。 convertRowIndexToModel'将视图的(JTable)行索引转换为模型索引。 – MadProgrammer

+0

谢谢。这是我想要的解决方案。再次感谢...... – shan