3

我用数据库中的一些数据创建了一个 swing jtable。在网络应用程序中,通常我向用户显示数据并将其唯一的数据库 id 设置为 html 标记属性,以便当用户单击说编辑时,我使用 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>

希望很清楚。谢谢

4

2 回答 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对象,因此您拥有所有必需的信息。

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

于 2012-08-07T10:44:04.900 回答
2

等价物是AbstractTableModel由 a 支持的子类实例List<YourObject>。当您编辑一行时,您从表中获取所选行的索引JTable.getSelectedRow()(的直接来自对象。JTable. convertRowIndexToModel()YourObjectYourObject

阅读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);
    }
}
于 2012-08-07T10:42:42.927 回答