在java swing Jtable中设置隐藏字段值

在java swing Jtable中设置隐藏字段值,java,swing,jtable,Java,Swing,Jtable,我用数据库中的一些数据创建了一个swing jtable。在web应用程序中,通常我会向用户显示数据,并将其唯一的数据库id设置为html标记属性,这样当用户单击say edit时,我会使用javascript从html标记属性中选择元素的隐藏db唯一id。这样,我就知道了哪个数据用户想要编辑,并且可以使用它的唯一主键在数据库中更新它。 现在,我如何在使用swing用java编写的桌面应用程序中实现这一点。 说得更清楚一点,我正在寻找一个相当于 <table> <tr id=1

我用数据库中的一些数据创建了一个swing jtable。在web应用程序中,通常我会向用户显示数据,并将其唯一的数据库id设置为html标记属性,这样当用户单击say edit时,我会使用javascript从html标记属性中选择元素的隐藏db唯一id。这样,我就知道了哪个数据用户想要编辑,并且可以使用它的唯一主键在数据库中更新它。 现在,我如何在使用swing用java编写的桌面应用程序中实现这一点。 说得更清楚一点,我正在寻找一个相当于

<table>
<tr id=1 ><td>david</td></tr>
<tr id=2 ><td>peter</td></tr>
<tr id=3 ><td>Timothy</td></tr>
</table>

大卫
彼得
提摩太

希望我很清楚。谢谢

等价物是由
列表支持的
AbstractTableModel
子类实例。编辑行时,从表中获取所选行的索引(
JTable.getSelectedRow()
),然后将该行索引转换为模型行索引(
JTable.convertRowIndexToModel()
),然后向模型询问该行的
YourObject
,您可以直接从对象获取对象的ID

有关更多详细信息,请阅读

public class UserTableModel extends AbstractTableModel {

    private List<User> users;

    public UserTableModel(List<User> users) {
        this.users = new ArrayList<User>(users);
    }

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

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

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        if (columnIndex == 0) {
            return users.get(rowIndex).getName();
        }
        else {
            throw new IllegalArgumentException();
        }
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        if (columnIndex == 0) {
            return String.class;
        }
        else {
            throw new IllegalArgumentException();
        }
    }

    public User getUserAtRow(int rowIndex) {
        return users.get(rowIndex);
    }
}
公共类UserTableModel扩展了AbstractTableModel{
私人名单用户;
公共用户表模型(列出用户){
this.users=新的ArrayList(用户);
}
@凌驾
public int getRowCount(){
返回users.size();
}
@凌驾
public int getColumnCount(){
返回1;
}
@凌驾
公共对象getValueAt(int行索引、int列索引){
如果(columnIndex==0){
返回users.get(rowIndex.getName();
}
否则{
抛出新的IllegalArgumentException();
}
}
@凌驾
公共类getColumnClass(int columnIndex){
如果(columnIndex==0){
返回字符串.class;
}
否则{
抛出新的IllegalArgumentException();
}
}
公共用户getUserAtRow(int rowIndex){
返回users.get(rowIndex);
}
}

备份
JTable
表格模型可以包含任何您喜欢的内容。例如,它可以包含如下对象

class User{
  public final int ID;
  public String name;
  public int age;
}
然后,您可以选择在
JTable

class MyTableModel implements TableModel{
  private List<User> users;
  @Override
  public Object getValueAt(int row, int column){
    if ( column == 0 ){
      return users.get( row ).name;
    }
  }
}
类MyTableModel实现TableModel{
私人名单用户;
@凌驾
公共对象getValueAt(int行,int列){
如果(列==0){
返回users.get(row).name;
}
}
}
但是由于您的
TableModel
仍然包含完整的
User
对象,因此您拥有所有必需的信息


注意:由于缺少方法,…,上述代码将无法编译。这里只是为了说明我的意思

谢谢。可以看出,这需要一种完全不同的思维方式!让我试试你的例子。这是我第一次在desktop.JB上开发,UserTableModel的构造函数应该具有用户对象的arraylist,对吗?在这种情况下,在构造函数中,this.users=users;其中users是用户对象的arraylist,而不是this.users=新的arraylist(users);如果我错了,请纠正我。谢天谢地,我们应该拿一张清单作为论据。它可能是一个LinkedList,在这种情况下,使用列表来支持表模型将导致糟糕的性能。调用方还可以在将列表传递给模型后更改列表(对其排序、删除其所有元素等)。为了安全起见,我复制了一份防御性的名单。如果您确定它是一个ArrayList,并且如果您确定没有人会修改模型后面的列表,那么没问题,您可以直接指定引用。谢谢。让我试试看。