在文本框中插入更新时禁用更新按钮

时间:2016-10-28 18:57:50

标签: java mysql swing jtable keyevent

我们正在执行"维护者"在课堂上使用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);

    }        
}

提前感谢您提供给我们的任何答案。

1 个答案:

答案 0 :(得分:3)

In general, because database access is inherently asynchronous, you should perform data manipulation in the background, typically using SwingWorker的XPath表达式。显示了一个完整的示例here。在您的上下文中,在启动工作线程之前禁用该按钮。

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

启用工作人员done()方法实施中的按钮,如图here所示。

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

附录:仔细查看您的特定用例,您可以按照建议prepareEditor()JTable @Override public Component prepareEditor(TableCellEditor editor, int row, int column) { Component c = super.prepareEditor(editor, row, column); button.setEnabled(false); return c; } 方法的实施中停用所需按钮}。

JTable

由于CellEditorListenerJTable,您可以按照hereeditingStopped() here enter image description here方法实施按钮。

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