绑定的 Jtable 或 Jlist return 数据库对象如何与 JPAController 一起使用?

How does a bound Jtable or Jlist return a database object to be used with a JPAController?

a Java 和 netbeans 菜鸟在这里。我有一个 Jtable 绑定到我的 Javadb。我可以使用 JPAController 与数据库交互。我可以使用 JComboBox 和 getSelectedItem() 方法轻松访问该对象,并将其转换为我的数据库对象以便进行编辑或销毁。例如:

private void deleteInfoButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                   
    Customers deleteInfo = (Customers) DeleteInfoComboBox.getSelectedItem();
    if (deleteInfo != null) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("CustomersPU");
        CustomersJpaController cjc = new CustomersJpaController(emf);
        try {
            cjc.destroy(deleteInfo.getId());
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(DeleteInformant.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}      

是否有类似的方法来 return 使用 Jtable 或 Jlist 的对象?我尝试使用 getSelectedRow() 方法,但这只是 returns 一个与 Jtable 中的行相关的整数,它与我的数据库中的 ID 不同。我看到 returns 对象的唯一其他方法是 getValueAt(),但它 returns 指定单元格的对象。对于 Jlist,getSelectedValuesList() 只是 return 一个字符串向量。 getSelectedValues() 似乎可以做我想做的,但已贬值。从其他帖子 (Here) 看来,我可能需要制作一个自定义表格模型,但该示例似乎没有考虑使用 netbeans 自动生成的 JPAController。

在此先感谢您的帮助!

更新:这是自动生成的代码,它使用请求的值填充 Jlist:

 // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {
    bindingGroup = new org.jdesktop.beansbinding.BindingGroup();

    CustomersPUEntityManager = java.beans.Beans.isDesignTime() ? null : javax.persistence.Persistence.createEntityManagerFactory("CustomersPU").createEntityManager();
    customerssQuery = java.beans.Beans.isDesignTime() ? null : CustomersPUEntityManager.createQuery("SELECT i FROM Customers i");
    customersList = java.beans.Beans.isDesignTime() ? java.util.Collections.emptyList() : customersQuery.getResultList();
    jScrollPane1 = new javax.swing.JScrollPane();
    jList1 = new javax.swing.JList<>();
    jButton1 = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    org.jdesktop.swingbinding.JListBinding jListBinding = org.jdesktop.swingbinding.SwingBindings.createJListBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, customersList, jList1);
    bindingGroup.addBinding(jListBinding);

    jScrollPane1.setViewportView(jList1);

    jButton1.setText("jButton1");

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(34, 34, 34)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 144, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGap(54, 54, 54)
            .addComponent(jButton1)
            .addContainerGap(89, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(65, 65, 65)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGroup(layout.createSequentialGroup()
                    .addGap(130, 130, 130)
                    .addComponent(jButton1)))
            .addContainerGap(105, Short.MAX_VALUE))
    );

    bindingGroup.bind();

    pack();
}// </editor-fold>                

NetBeans 自动生成一个名为 customersList 的变量,其中包含填充 Jtable 或 Jlist 的客户对象列表。通过使用具有所选项目索引的 get() 方法,此变量​​可用于访问所选对象。

对于一个 Jtable:

Customers selectedCustomer = customersList.get(jTable1.getSelectedRow());

对于具有多项选择的 Jlist,可以生成一个 Customers 对象数组,可以使用 JPAController 对其进行迭代和操作:

 Customers[] selectedCustomers = new Customers [jList1.getSelectedIndices().length];

    for (int i = 0; i < jList1.getSelectedIndices().length; i++) {
        selectedCustomers[i] = customersList.get(jList1.getSelectedIndices()[i]);
    }

这仅在 Jlist 或 Jtable 的顺序不变时有效。如果您希望能够对您的项目进行排序,那么您可以遍历列表以找到正确的对象。这就是我在 Jtable 中利用我的 table:

的 ID 列实现它的方式
public static int idColumn = 0;

for (Customers i : customersList) {
    if (i.getId() == jTable1.getValueAt(jTable1.getSelectedRow(), idColumn)) {
        Customers selectedCustomer = i;
    }
}