2012-08-07 97 views
2

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

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

希望清楚。谢谢

回答

2

相当于一个AbstractTableModel子类实例支持List<YourObject>。当你编辑一行时,你从表(JTable.getSelectedRow())得到选定行的索引,然后你将这个行索引转换为模型行索引(JTable. convertRowIndexToModel()),然后你问你的模型YourObject在这一行,你直接从对象获得YourObject的ID。

阅读JTable tutorial了解更多详情。

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); 
    } 
} 
+0

谢谢JB Nizet。可以看到它需要一种完全不同的思维!让我试试你的例子。这是我第一次在桌面上开发。 – 2012-08-07 11:55:41

+0

JB,UserTableModel的构造函数应该是一个用户对象的数组列表,对吧?那么在这种情况下,在构造函数中,this.users = users;用户是用户对象的数组列表,而不是this.users = new ArrayList (users);纠正我,如果我错了。谢谢 – 2012-08-07 13:47:36

+0

它应该采用List作为参数。它可能是一个LinkedList,在这种情况下,使用列表来支持表模型会导致糟糕的性能。调用者也可以在将它传递给模型(对其进行排序,删除其所有元素等)后更改列表。为了安全起见,我做了一个防御性的副本。如果你确定它是一个ArrayList,并且你确定没有人会修改模型后面的列表,那么没问题,你可以直接分配参考。 – 2012-08-07 13:51:23

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对象,你拥有所有必需的信息。

注意:上面的代码由于缺少方法而不能编译...。这里只是为了说明我的意思

+0

THanks Robin。让我试试看。 – 2012-08-07 11:57:12