在Java Swing JTable中设置隐藏字段的值

3
我已经创建了一个带有一些来自数据库的数据的Swing JTable。在Web应用程序中,通常我会将数据显示给用户,并将其唯一的数据库ID设置为HTML标记属性,以便当用户点击编辑时,我可以使用JavaScript从HTML标记属性中获取元素的隐藏数据库唯一ID。这样,我就知道用户想要编辑哪些数据,并且可以使用其唯一主键更新数据库。 现在,如何在使用Java Swing编写的桌面应用程序中实现此功能。 更明确地说,我正在寻找一个相当于以下内容的东西;
<table>
<tr id=1 ><td>david</td></tr>
<tr id=2 ><td>peter</td></tr>
<tr id=3 ><td>Timothy</td></tr>
</table>

希望我表达清楚了。谢谢。
2个回答

4
你的TableModel是支持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;
    }
  }
}

但由于您的TableModel仍然包含完整的User对象,因此您拥有所有所需的信息。

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


谢谢Robin。让我试一下。 - David Okwii

2
相应的,您需要一个由List<YourObject>支持的AbstractTableModel子类实例。当您编辑一行时,您从表格中获取所选行的索引(JTable.getSelectedRow()),然后将此行索引转换为模型行索引(JTable.convertRowIndexToModel()),然后询问您的模型在该行处的YourObject,并直接从对象中获取YourObject的ID。
阅读JTable教程以获取更多详细信息。
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);
    }
}

谢谢JB Nizet。我可以看出这需要完全不同的思维方式!让我试试你的例子。这是我第一次在桌面上开发。 - David Okwii
JB,UserTableModel的构造函数应该接受一个用户对象的ArrayList,对吧?那么在构造函数中,this.users = users;,其中users是一个用户对象的ArrayList,而不是this.users = new ArrayList<User>(users); 如果我错了,请纠正我。谢谢。 - David Okwii
它应该以List作为参数。它可以是LinkedList,如果使用列表来支持表模型,将导致可怕的性能。调用者还可以在将其传递给模型后更改列表(对其进行排序,删除所有元素等)。为了安全起见,我制作了列表的防御性副本。如果您确定它是ArrayList,并且如果您确定没有人会在模型背后修改列表,则没有问题,您可以直接分配引用。 - JB Nizet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接