2011-06-23 17 views
0

美好的一天!如何在JFrame上刷新数据库查询?

我有上显示向JTable帧我的数据库的更新版中的问题......

我的JFrame里面的一切都刚刚生成,我只是按照这个链接指令:Binding JTable with MySQL

它工作正常,直到我添加了一个新的JFrame为UPDATES的数据库,当我点击按钮查看库存(JFrame包含JTable显示数据在MySQL),它不显示更新版本的数据库。

但是,关闭应用程序并运行ViewInventory JFrame ..它已被更新。

请帮助...这是生成的代码:

public class ViewInventory extends javax.swing.JFrame { 

    public ViewInventory() { 
     initComponents(); 
     setLocation(300, 120); 
    } 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 
     bindingGroup = new org.jdesktop.beansbinding.BindingGroup(); 

     inventoryPUEntityManager = java.beans.Beans.isDesignTime() ? null : javax.persistence.Persistence.createEntityManagerFactory("inventoryPU").createEntityManager(); 
     itemsQuery = java.beans.Beans.isDesignTime() ? null : inventoryPUEntityManager.createQuery("SELECT i FROM Items i"); 
     itemsList = java.beans.Beans.isDesignTime() ? java.util.Collections.emptyList() : itemsQuery.getResultList(); 
     jScrollPane1 = new javax.swing.JScrollPane(); 
     jTable1 = new javax.swing.JTable(); 
     jLabel1 = new javax.swing.JLabel(); 
     jButton1 = new javax.swing.JButton(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jTable1.setAutoCreateRowSorter(true); 
     jTable1.setAlignmentX(1.0F); 
     jTable1.setAlignmentY(2.0F); 
     jTable1.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS); 
     jTable1.setSelectionMode(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); 

     org.jdesktop.swingbinding.JTableBinding jTableBinding = org.jdesktop.swingbinding.SwingBindings.createJTableBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, itemsList, jTable1); 
     org.jdesktop.swingbinding.JTableBinding.ColumnBinding columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${id}")); 
     columnBinding.setColumnName("Id"); 
     columnBinding.setColumnClass(Integer.class); 
     columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${itemName}")); 
     columnBinding.setColumnName("Item Name"); 
     columnBinding.setColumnClass(String.class); 
     columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${category}")); 
     columnBinding.setColumnName("Category"); 
     columnBinding.setColumnClass(String.class); 
     columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${QBox}")); 
     columnBinding.setColumnName("QBox"); 
     columnBinding.setColumnClass(Integer.class); 
     columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${unitPriceBox}")); 
     columnBinding.setColumnName("Unit Price Box"); 
     columnBinding.setColumnClass(Double.class); 
     columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${subTotalBox}")); 
     columnBinding.setColumnName("Sub Total Box"); 
     columnBinding.setColumnClass(Double.class); 
     columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${QPc}")); 
     columnBinding.setColumnName("QPc"); 
     columnBinding.setColumnClass(Integer.class); 
     columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${unitPricePc}")); 
     columnBinding.setColumnName("Unit Price Pc"); 
     columnBinding.setColumnClass(Double.class); 
     columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${subTotalPc}")); 
     columnBinding.setColumnName("Sub Total Pc"); 
     columnBinding.setColumnClass(Double.class); 
     columnBinding = jTableBinding.addColumnBinding(org.jdesktop.beansbinding.ELProperty.create("${grandTotal}")); 
     columnBinding.setColumnName("Grand Total"); 
     columnBinding.setColumnClass(Double.class); 
     bindingGroup.addBinding(jTableBinding); 

     jScrollPane1.setViewportView(jTable1); 

     jButton1.setText("Main Menu"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton1ActionPerformed(evt); 
      } 
     }); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 514, Short.MAX_VALUE) 
        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 329, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(jButton1, javax.swing.GroupLayout.Alignment.TRAILING)) 
       .addContainerGap()) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addContainerGap() 
       .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 275, Short.MAX_VALUE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 
       .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(14, 14, 14) 
       .addComponent(jButton1) 
       .addContainerGap()) 
     ); 

     bindingGroup.bind(); 

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

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
     new Menu().setVisible(true); 
     setVisible(false); 
    }           

    public static void main(String args[]) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       new ViewInventory().setVisible(true); 
      } 
     }); 
    } 
    // Variables declaration - do not modify      
    private javax.persistence.EntityManager inventoryPUEntityManager; 
    private java.util.List<inventory.Items> itemsList; 
    private javax.persistence.Query itemsQuery; 
    private javax.swing.JButton jButton1; 
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JScrollPane jScrollPane1; 
    private javax.swing.JTable jTable1; 
    private org.jdesktop.beansbinding.BindingGroup bindingGroup; 
    // End of variables declaration     
} 

我很抱歉,如果我显示在生成的代码的一切。

这是我的EditItemDetails代码:

try { 
      Class.forName(Connect.DRIVER); 
      Connection con = DriverManager.getConnection(Connect.CONNECTION_STRING, 
        Connect.USERNAME, Connect.PASSWORD); 

      Statement stat = con.createStatement(); 

      ResultSet rs = stat.executeQuery("SELECT id, category," 
        + "q_box, unit_price_box, sub_total_box, q_pc, " 
        + "unit_price_pc, sub_total_pc, grand_total from items WHERE " 
        + "item_name = '" + item_name_combobox.getSelectedItem() + "';"); 

      String category; 
      int q_box, q_pc; 
      double unit_price_box, sub_total_box, unit_price_pc, sub_total_pc, 
        grand_total; 

      if (rs.next()) { 
       q_box = rs.getInt("q_box"); 
       category = rs.getString("category"); 
       unit_price_box = rs.getDouble("unit_price_box"); 
       sub_total_box = rs.getDouble("sub_total_box"); 
       q_pc = rs.getInt("q_pc"); 
       unit_price_pc = rs.getDouble("unit_price_pc"); 
       sub_total_pc = rs.getDouble("sub_total_pc"); 
       grand_total = rs.getDouble("grand_total"); 

       double new_sub_total_box = q_box * Integer.parseInt(new_unit_price_box_txtfld.getText()); 
       double new_sub_total_pc = q_pc * Integer.parseInt(new_unit_price_pc_txtfld.getText()); 
       grand_total = new_sub_total_box + new_sub_total_pc; 

      stat.executeUpdate("UPDATE items SET unit_price_box = " + new_unit_price_box_txtfld.getText() 
        + ", unit_price_pc = " + new_unit_price_pc_txtfld.getText() 
        + ", sub_total_box = " + new_sub_total_box 
        + ", sub_total_pc = "+ new_sub_total_pc 
        + ", grand_total = "+ grand_total 
        + " WHERE item_name = '" 
        + item_name_combobox.getSelectedItem() + "';"); 

       sub_total_box_txtfld.setText(Double.toString(new_sub_total_box)); 
       sub_total_pc_txtfld.setText(Double.toString(new_sub_total_pc)); 
       grand_total_txtfld.setText(Double.toString(grand_total)); 

       lblmsg.setText("Record Saved!"); 

       con.close(); 
      } 
     } catch (Exception e) { 
      lblmsg.setText("Error: "+ e.getMessage()); 
      System.out.println("Error: "+ e.getMessage()); 
     } 
+1

我编辑了你的帖子,如果不是...,只需要注意一个通知 - 对于你的DB语句你必须添加finally块,并且在这个块内你必须关闭Connection和ResultSet – mKorbel

回答

0

个人我不喜欢NetBeans GUI设计了很多的原因。这对于原型设计和小型项目来说很不错,对于大型项目来说很糟糕,并且需要重新进行维护。但这是另一次的咆哮。

什么问题是你从JPA查询中取回静态列表。您需要让GUI在编辑事件后重新运行查询以获取更新列表。我得到了这种在GUI设计工作的事情的方式是集合更改为ObservableList在“自定义创建代码”:

someList = Beans.isDesignTime() ? java.util.Collections.emptyList() : ObservableCollections.observableList(new ArrayList<Something>()); 

后来,当我有这样的更新JTable的内容的GUI事件,我这样做:

someList.clear(); 
someList.add(query.getResultList()); 

我做这种方式,因为我得到通过EJB远程会话bean列表,我在有关NetBeans 6.5或7做了很久以前(最后一次我用了GUI设计师创建一个新表单)。显然现在有一个“可修改包装”和“可观察”你可以设置查询结果。这可能会做你所需要的,否则按照上面的手动方式来做。