Java 如何在JTable行中设置自定义对象
我应该首先告诉大家,这不是关于呈现表格单元格的 下面是我正在使用基于数据库中Java 如何在JTable行中设置自定义对象,java,swing,user-interface,jtable,tablemodel,Java,Swing,User Interface,Jtable,Tablemodel,我应该首先告诉大家,这不是关于呈现表格单元格的 下面是我正在使用基于数据库中User对象的2D数组构建的TableModel List<User> userList = userManagerService.getAllUsers(); /* String[] col_user = {"Username", "Name", "Phone", .... } */ String[][] data = new String[userList.size()][col
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);
不要在创建模型之前拆分
用户
对象,而是直接将其添加到模型中,并允许模型为您完成工作
比如说
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);
}
}
您是否能够修改
VstTableItemModel
?是。我需要把它贴在这里吗?不,这只会使它更容易;)谢谢但是,如果我对它进行排序,会发生什么?然后,行索引将更改。不是吗?如果您使用的是JTable
的排序API,那么您可以简单地使用JTable。convertRowIndexToModel
将视图的(JTable)行索引转换为模型索引。我应该指出,行排序器API(TableRowSorter
)在排序时使用代理模型,它实际上不会更改数据模型,而是在视图和模型之间映射索引很高兴我今天帮助了某人:D
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);