【问题标题】:How to get the stored object from JTable如何从 JTable 中获取存储的对象
【发布时间】:2017-05-05 15:27:22
【问题描述】:

我有一个 JTable,我可以在其中添加具有多个属性(例如年龄、姓名等)的用户。这样可以将用户添加到我的数组列表和 JTable 中。 现在我想要的是当我选择 JTable 行时,能够获取存储在用户的 arrayList 中的对象,以便我可以修改或删除它们。

这是我将用户添加到 JTable 时的代码示例:

private void jButtonAddAUserActionPerformed(java.awt.event.ActionEvent evt) {                                                
   User obj=new User();
   obj.setName(jTextFieldName.getText());
   obj.setAdress(jTextFieldAdress.getText());
   obj.setNumCC(Integer.parseInt(jTextFieldNumCC.getText()));
   obj.setTele(Integer.parseInt(jTextFieldTele.getText()));
   obj.setUserName(jTextFieldUserName.getText());
   obj.setPassword(jTextFieldPassword.getText());

   DefaultTableModel model=(DefaultTableModel) jTableUsers.getModel();
   model.addRow(new Object[]{
       jTextFieldName.getText(),
       jTextFieldAdress.getText(),
       jTextFieldTele.getText(),
       jTextFieldNumCC.getText(),
       obj.isAdmin
   });

   usersList.add(obj);
   JOptionPane.showMessageDialog(null,"Data inserted correctly.");
   jTextFieldName.setText("");
   jTextFieldAdress.setText("");
   jTextFieldNumCC.setText("");
   jTextFieldTele.setText("");
   jTextFieldPassword.setText("");
   jTextFieldUserName.setText("");
}   

编辑: 以下是删除已工作用户的代码:

private void jButtonRemoverActionPerformed(java.awt.event.ActionEvent evt) {

    DefaultTableModel model = (DefaultTableModel) jTableInvestidores.getModel();

    User u = userList.get(jTableUsers.getSelectedRow()); 
    userList.remove(u);
    model.removeRow(jTableUsers.getSelectedRow());
    JOptionPane.showMessageDialog(null,"Data removed.");

}  

这是更新用户的代码,但仍然无法正常工作,我正在尝试从 jTextFields 更新它:

private void jButtonUpdateActionPerformed(java.awt.event.ActionEvent evt) {                                                  

    DefaultTableModel model = (DefaultTableModel) jTableUsers.getModel();
    userList.get(jTableUsers.getSelectedRow());
    model.setValueAt(jTextFieldName.getText(), jTableUsers.getSelectedRow(),0);
    model.setValueAt(jTextFieldAdress.getText(), jTableUsers.getSelectedRow(),1);
    model.setValueAt(jTextFieldPhone.getText(), jTableUsers.getSelectedRow(),2);
    model.setValueAt(jTextFieldNumCC.getText(), jTableUsers.getSelectedRow(),3);
    User u =userList.get(jTableUsers.getSelectedRow());

    JOptionPane.showMessageDialog(null,"Data updated.");

}   

谁能帮我解决这个问题?谢谢!

【问题讨论】:

  • userList.get(table.getSelectedRow()); 将在给定索引处生成一个用户对象。现在您可以修改用户对象并替换列表中的用户。之后用修改后的数据“重绘”你的表

标签: java swing jtable


【解决方案1】:

你可以使用类似的东西。遗憾的是,您没有指定要如何编辑用户。

User u=userList.get(table.getSelectedRow());  //get user for editing
int location=table.getSelectedRow();  //get location in list to maintain order
userList.remove(u);  //remove selected user to edit variables
//modify user u
userList.add(location,u);  //insert user at previous location in list
model.setRowCount(0);  //reset table model
for (int i = 0; i < userList.size(); i++) {  //refill table model 
    User u = userList.get(i);  /7get user
    Vector<Object> vhelp = new Vector<>(); //create vector to store the values of the variables from user
    vhelp.add(/*your data*/);  // 1 add per variable that should be displayed in table
    model.addRow(vhelp); //add the data to the table model (fills the table with data)
}

你的方法应该是这样的:

    DefaultTableModel model = (DefaultTableModel) jTableUsers.getModel();
    User u = userList.get(jTableUsers.getSelectedRow());
    int location=jTableUsers.getSelectedRow();
    userList.remove(u);
    u.setName(jTextFieldName.getText());
    u.setAdress(jTextFieldAdress.getText());
    u.setNumCC(Integer.parseInt(jTextFieldNumCC.getText()));
    u.setTele(Integer.parseInt(jTextFieldTele.getText()));
    //u.isAdmin can't tell what this has to be
    userlist.add(location,u);

    model.setRowCount(0);  
    for (int i = 0; i < userList.size(); i++) {  
        User u = userList.get(i);  
        Vector<Object> vhelp = new Vector<>(); 
        vhelp.add(u.getName()); 
        vhelp.add(u.getAddress());
        vhelp.add(u.getTele());
        vhelp.add(u.getNumCC());
        vhelp.add(u.isAdmin);
        model.addRow(vhelp);
    }
    JOptionPane.showMessageDialog(null, "Data updated.");

【讨论】:

  • 是否需要 jTable 中的所有对象(用户)属性?我删除的索引超出范围可能是因为它吗?
  • 我收到错误后:用户 u=userList.get(table.getSelectedRow());
  • userList.remove(u);
  • 错误是索引超出范围,我已修复,我现在正在尝试了解您的代码以编辑用途
  • 我认为它相当简单。首先,您获取要编辑的用户,以及它在列表中的位置。然后删除具有旧参数的用户,并在以前所在的相同位置添加具有新参数的“新”用户。之后,您使用与以前几乎完全相同的数据“重建”表,不同之处在于您更新的用户具有与以前不同的值
【解决方案2】:

用户被添加到我的数组列表和 JTable 中。

不要将数据存储在两个不同的地方。数据只能存储在JTableTableModel中。

因此,您可以创建一个自定义“用户”对象来包含有关每个用户的数据。然后您可以创建一个自定义的TableModel 来保存“用户”对象,该对象可以通过JTable 显示和访问。

现在我想要的是当我选择 JTable 行时,能够获取存储在用户的 arrayList 中的对象,以便我可以修改或删除它们。

查看Table Row Model,了解创建自定义TableModel 的分步方法。它包含您从TableModel 动态添加、访问和删除对象所需的所有方法。

【讨论】:

  • 我认为我需要为此重写我的大部分代码,而且我不知道我是否可以执行与我相同的方法,即拥有一个包含所有数据的类,这是序列化的,以便我可以稍后将其保存到文件和对象中......但我会尝试看看我能得到......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
相关资源
最近更新 更多