2016-10-28 52 views
0

我們正在教室中執行「Maintainer」程序以使用MySQL和Java NetBeans管理數據庫。我們很好,但我們想知道如何創建某種事件來通過文本框/點擊插入/修改信息到數據庫時禁用「更新按鈕」。在插入文本框時禁用更新按鈕以進行更新

執行項目時,我們可以通過在表格的選中/單擊文本框中寫入/修改數據,直接將數據修改爲MySQL數據庫;修改完成後,我們需要按ENTER所以修改得到寫入,然後我們按Modificar按鈕使更新生效。

我們想知道的是,我們如何切換Modificar按鈕在文本框激活時編輯時不可點擊。因爲如果我們不按ENTER首先修改完成後,點擊更新按鈕,當文本框處於活動狀態時,由於數據無效而拋出錯誤。

這裏我們可以通過點擊文本框(*紅框)來編輯信息,同時這樣做(當文本框點擊並編輯信息時),我們希望「更新按鈕」被禁用/不可點擊(綠色圓圈)。

Image 1

到目前爲止,這裏是我們的代碼的事件,但並不是我們想要的: (其中「btnactualizar」的更新按鈕和「tabla_cliente」是包含文本框表)

private void tabla_clienteKeyPressed(java.awt.event.KeyEvent evt) {           

    if (evt.getKeyCode() == KeyEvent.VK_ENTER){ 
     btnactualizar.setEnabled(true); 

    } 

} 

這是更新按鈕:

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

    String Rut = String.valueOf(tabla_cliente.getValueAt(tabla_cliente.getSelectedRow(), 0)); 
    String Nombre = String.valueOf(tabla_cliente.getValueAt(tabla_cliente.getSelectedRow(), 1)); 
    String Apellido = String.valueOf(tabla_cliente.getValueAt(tabla_cliente.getSelectedRow(), 2)); 
    String Patente = String.valueOf(tabla_cliente.getValueAt(tabla_cliente.getSelectedRow(), 3)); 

    int conf = JOptionPane.showConfirmDialog(null, "Estas seguro de actualizar? ", "mensaje", JOptionPane.YES_NO_OPTION, JOptionPane.YES_NO_OPTION); 

    if (conf == JOptionPane.OK_OPTION) { 

     exeCliente.actualizar_Cliente(Rut, Nombre, Apellido, Patente); 

    } 
} 

這是更新方法:

public void actualizar_Cliente(String run,String nombre, String apellido, String patente) 
{   
    try{ 
     conectar();   
     String SQL = "UPDATE CLIENTE SET Nombre='"+nombre+"', Apellido='"+apellido+"', Patente='"+patente+"' WHERE Rut='"+run+"';"; 

     sentencia.executeUpdate(SQL); 
     JOptionPane.showMessageDialog(null,"Datos Actualizados"); 

     conexion.close(); 
     sentencia.close(); 
    } 
    catch(Exception e) 
    { 
     JOptionPane.showMessageDialog(null,"Error:" +e.getMessage(),"Error",JOptionPane.ERROR_MESSAGE); 

    }   
} 

非常感謝您爲我們提供的任何答案。

回答

3

一般來說,因爲數據庫訪問本質上是異步的,所以您應該在後臺執行數據操作,通常使用SwingWorker。一個完整的例子顯示爲here。在您的上下文中,在啓動輔助線程之前禁用該按鈕。

button.setEnabled(false); 
worker.execute(); 

啓用您的實現工人的done()方法的按鈕,如圖所示here

@Override 
protected void done() { 
    button.setEnabled(true); 
}  

附錄:看你的具體使用情況接近,你可以在你執行JTableprepareEditor()方法禁用所需的按鈕,如建議here

@Override 
public Component prepareEditor(TableCellEditor editor, int row, int column) { 
    Component c = super.prepareEditor(editor, row, column); 
    button.setEnabled(false); 
    return c; 
} 

因爲JTableCellEditorListener,你可以在你執行JTableeditingStopped()方法的啓用按鈕,討論here

@override 
public void editingStopped(ChangeEvent ce) { 
    super.editingStopped(ce); 
    button.setEnabled(true); 
} 
+0

感謝您的回答!我正在尋找關於如何實現「prepareEditor」和「editingStopped」的信息,但我只是不明白。我需要創建一個類?主Jframe在哪裏?另一班? 以前從未使用「@override」,抱歉打擾您,我們是學生,您的解決方案是我們還沒有學習或看到的東西。 我想要親自問我的老師,但我不認爲他知道答案。 非常感謝您提前 –

+0

我們的jTables包含在jFrame中。也許我應該去每個jTable屬性的「自定義代碼」? –

+0

我的意思是,所有例子都看過,看起來不像我們的項目。我們只有一個JFrame,然後像「show」,「insert」這樣的所有公共空白在那裏,然後我們爲每個「客戶」,「車輛」和「註冊」有3個「mantainers」。我們沒有別的。我們必須創建一個新的包?新界面? –