【问题标题】:Disable update button while inserting in textbox for update在文本框中插入更新时禁用更新按钮
【发布时间】:2017-03-11 17:31:16
【问题描述】:

我们正在课堂上执行“维护者”计划,以使用 MySQL 和 Java NetBeans 管理数据库。我们很好,但我们想知道如何创建某种事件以在通过文本框/单击将信息插入/修改数据库时禁用“更新按钮”。

在执行项目时,我们可以通过在表的选中/点击文本框中写入/修改直接修改数据到MySQL的数据库中;修改完成后,我们需要按ENTER这样修改被写入,然后我们按Modificar按钮使更新生效。

我们想知道的是如何在文本框处于活动状态时将 Modificar 按钮切换为不可点击。因为如果我们在修改完成后不先按ENTER,在文本框处于活动/编辑状态时单击Update按钮会由于数据尚未生效而引发错误。

在这里,我们可以通过单击文本框(*红色框)来编辑信息,同时(在单击文本框并编辑信息时)我们希望“更新按钮”被禁用/不可点击(绿色圆圈)。

到目前为止,这是我们的事件代码,但不是我们想要的: (其中“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);

    }        
}

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

【问题讨论】:

    标签: java mysql swing jtable keyevent


    【解决方案1】:

    一般而言,由于数据库访问本质上是异步的,因此您应该在后台执行数据操作,通常使用SwingWorker。一个完整的例子显示在here。在您的上下文中,在启动工作线程之前禁用该按钮。

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

    在你的worker的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);
    }
    

    【讨论】:

    • 感谢您的回答!!我正在寻找有关如何实现“prepareEditor”和“editingStopped”的信息,但我只是不明白如何。我需要创建一个类?在哪里,在主 Jframe 中?另一个班级?以前从未使用过“@override”,很抱歉打扰您,我们是学生,您的解决方案是我们尚未学习或看到的东西。我打算亲自去问我的老师,但我认为他不知道答案。非常感谢您提前
    • 我们的 jTables 包含在一个 jFrame 中。也许我应该在每个 jTable 属性上“自定义代码”?
    • 我的意思是,我见过的所有例子,看起来都不像我们的项目。我们只有一个 JFrame,然后像“show”、“insert”这样的所有公共空白都在那里,然后每个“client”、“vehicle”和“register”都有 3 个“mantainers”。我们没有别的了。我们必须创建一个新的包?新界面?
    • 我会限制example 的 GUI 构建器的范围,直到您了解更多,并研究引用的示例以了解 JTable 如何与 JDBC 一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多