2017-08-01 72 views
0

嗨我试图从我的JTable更新特定的单元格。我正在进行预订,一旦所选预订获得批准,它将从“否”更改为“是”。 但是,在点击批准后,ReservationStatus中的所有列都从No更改为Yes,但我只想要更改特定的单元格(例如,第0行第6列)。 这是我对JTable代码:从Jtable中更新特定的单元格在SQL中

table = new JTable(){ 
     public boolean isCellEditable(int row, int col) { 
      return false; 
     }; 
    }; 
    table.getTableHeader().setReorderingAllowed(false); 
    table.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseClicked(MouseEvent e) { 
      row = table.rowAtPoint(e.getPoint()); 
      col = table.columnAtPoint(e.getPoint()); 
      data = table.getValueAt(row, col); 
      System.out.println("Row= " + row + "column =" + col + "Data= " + data); 
      DefaultTableModel model = (DefaultTableModel)table.getModel(); 
      int selectedRowIndex = table.getSelectedRow(); 
      if(e.getClickCount() == 2) { 
       if(col == 6){ 
        frame.setContentPane(new approvalReservation(frame)); 
        approvalReservation.lblDisplayAdminNo.setText(model.getValueAt(selectedRowIndex, 0).toString()); 
        approvalReservation.lblDisplayMusicalInstrument.setText(model.getValueAt(selectedRowIndex, 1).toString()); 
        approvalReservation.lblDisplayDuration.setText(model.getValueAt(selectedRowIndex, 2).toString()); 
        approvalReservation.lblDisplayExtension.setText(model.getValueAt(selectedRowIndex, 5).toString()); 
       } 
       else if(col == 7) { 
        frame.setContentPane(new approvalAccess(frame)); 
        approvalAccess.lblDisplayAdminNo.setText(model.getValueAt(selectedRowIndex, 0).toString()); 
        approvalAccess.lblDisplayLockerNumber.setText(model.getValueAt(selectedRowIndex, 3).toString()); 
        approvalAccess.lblDisplayLocation.setText(model.getValueAt(selectedRowIndex, 4).toString()); 
       } 

      } 
     } 
    }); 


    scrollPane.setViewportView(table); 

    JButton btnLoadTable = new JButton("Load Table"); 
    btnLoadTable.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      approvalController ac = new approvalController(); 
      ArrayList<String> approvalList = approvalController.displayTableReservation(); 
      for(int i = 0; i < approvalList.size(); i++) { 
       approvalList.get(i); 
      } 

     } 
    }); 

PS:我宣布ROW和COL作为公共静态的,所以两者都可以传递到另一个JPanel的。

而这是审批表代码:

JButton btnApprove = new JButton("Approve"); 
    btnApprove.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      Connection connection=null; 
      connection = sqliteConnection.dbConnector(); 
      try { 
       String query = "Update approval set reservationStatus = 'Yes' where reservationStatus = '" + approvalMain.data + "'"; 
       PreparedStatement pst = connection.prepareStatement(query); 
       pst.executeUpdate(); 
       System.out.println("Updated"); 
       JOptionPane.showMessageDialog(null, "Data Updated"); 


      } 

      catch(Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
    btnApprove.setBackground(SystemColor.info); 
    btnApprove.setBounds(650, 361, 135, 50); 
    panel.add(btnApprove); 

另一个问题是,当更改为reservationStatus是“否”,则用户无法点击进入下一栏,AccessStatus。由于只有在ReservationStatus获得批准后才可点击AccessStatus,因此从No到Yes。我该如何去做呢?到目前为止,可以单击列中的两个单元格。

JTable Before Approving

After clicking on Approve, note that all the cells in ReservationStatus has been changed from No to Yes

+0

1)您的“批准”按钮甚至不更新JTable,所以谁知道表中的值如何更改。你所有的代码都会在你的数据库上调用SQL。此外,您正在使用PreparedStatement不正确。你应该为PreparedStatement设置参数。例如:https://stackoverflow.com/questions/15713360/geting-data-from-multiple-table-when-selecting-a-row-then-clicking-a-button/15713391#15713391 – camickr

+0

2)为什么你使用MouseListener?看起来这个逻辑可能会完全刷新JTable。如果是这样,那么这告诉我你的SQL更新数据将所有的值设置为“是”。因此,修复SQL并正确使用PreparedStatement,发现错误将更容易。不要忘记添加调试代码来显示传递给PreparedStatement的参数值。 – camickr

+0

3)我甚至不确定为什么需要MouseListener或为什么需要重置内容窗格?编辑表格应导致表格自行更新。此外,您将使用'setModel(...)'方法来刷新表格,而不是创建一个全新的表格。 – camickr

回答

0
String query = "Update approval set reservationStatus = 'Yes' where reservationStatus = '" + approvalMain.data + "'"; 

假设approvalMain.data等于'No',这个查询是说在目前状态为'No'更新每一行的状态。如果您只想更改一行,则需要在where子句中指定它,最好使用表中的主键列。

+0

是的,approvalMain.data会给'No',但是 row = table.rowAtPoint(e.getPoint()); col = table.columnAtPoint(e.getPoint()); data = table.getValueAt(row,col); 不应该获取该Jtable的特定行和列的值吗? 在这种情况下,第0行第6列的值是'不',它不应该更新该特定值而不是所有内容吗? – Ruiru

+0

那么,我该如何更新一个特定的行和列呢? 我试过table.getModel()。getValueAt(approvalMain.col,approvalMain。行)+“'” 但它不起作用 – Ruiru

+0

它正在获取特定行的值。然后,您的查询将通知数据库更新具有该值的任何行,并且多行具有相同的值。它无法知道哪个相同的值是你给它的值,所以它匹配所有的值。你需要一个“where”子句,它的值只能匹配你想要的行。使用数据库表的主键。 –