【问题标题】:Updating main form after closing secundary form关闭辅助窗体后更新主窗体
【发布时间】:2012-03-18 13:01:59
【问题描述】:

我正在为我的妻子创建一个小型患者管理软件。该程序功能齐全,但一旦我更新患者数据或排除任何注册,我就会遇到问题。 我有一个搜索表格来带入所有患者(使用日期、姓名...),然后我选择所需的患者(从上次访问开始),所有患者的数据都显示在另一个表格中。我可以更新数据,排除这次访问,但是一旦我保存它,这个表格(次要)就会关闭(处理)。但主要形式(搜索形式)保留以前的值。 关闭辅助窗体后如何刷新主窗体??? 非常感谢

已编辑:忘了说它的 Java - sry ;)

编辑2: 这是我用来调用二级表格的方法。我使用 Netbeans 创建项目。

private void btn_selecionaActionPerformed(java.awt.event.ActionEvent evt) {                                              
        try{
        int sel = tabela.getSelectedRow();

        if (sel != -1){
            String sql = "select * from agendados "
                    + "where numag = " + modelo.getValueAt(sel, 5);
            con_mnt.executaSQL(sql);
            func = new Funcoes();
            func.carregaDados(dados, con_mnt.rs);
            new CarregarAgendamento(func.getDados()).setVisible(true);

        } else{
            JOptionPane.showMessageDialog(null, "Selecione algum paciente antes.", "   Atenção!!!", JOptionPane.ERROR_MESSAGE);
        }

        }
        catch(SQLException | NumberFormatException e){
            JOptionPane.showMessageDialog(null, "Nao existe dados ainda", "   Atenção!!!", JOptionPane.ERROR_MESSAGE);
        }
    }

编辑 3: 保存、删除和 salvarAgenmento 方法:

private void btn_salvaActionPerformed(java.awt.event.ActionEvent evt) {                                          
    salvarAgendamento();
    dispose();
}                                         

private void btn_deleteActionPerformed(java.awt.event.ActionEvent evt) {                                           
    if(javax.swing.JOptionPane.showConfirmDialog(null,"Deseja realmente Excluir este Agendamento?","ATENÇÃO ",javax.swing.JOptionPane.YES_NO_OPTION )==0)
    {  
        con_ag = new Firebird(func.fullPath("/db/manutencao.fdb"));
        con_ag.removeFDB("agendados", "numag", jt_cod.getText());
        Agendados.refresh = 1;
        this.dispose();  
    }  

}

public void salvarAgendamento(){
        ArrayList<Object> colunas = new ArrayList<>();
        ArrayList<Object> valores = new ArrayList<>();
        calendario = new Calendario();

        if (jcb_motivo.getSelectedIndex() == -1)
        {
            JOptionPane.showMessageDialog(null, "Faltou o Motivo do Agendamento!");
            jcb_motivo.requestFocus();
        } 
        else if (jt_dataAg.getText().equals(""))
        {
            JOptionPane.showMessageDialog(null, "Faltou a Data do Agendamento!");
            jt_dataAg.requestFocus();
        } 
        else if (dados.getStatusAg() == 0)
        {
            JOptionPane.showMessageDialog(null, "Faltou selecionar o Status do Agendamento!");
            jcb_status.requestFocus();
        }
        else
        {
            calendario.dataFormatada("dd/mm/yyyy", "yyyy-mm-dd", jt_dataAg.getText());
            dados.setDataAg(calendario.getDataFormatada() + " 00:00:00");

            colunas.add("statusag");
            colunas.add("obs");

            valores.add(jt_tel1.getText());
            valores.add(jt_tel2.getText());
            valores.add(jt_cel.getText());
            valores.add(dados.getConvenioNum()); //convnum
            valores.add(dados.getDentistaNum()); //dentnum
            valores.add(jcb_motivo.getSelectedItem());
            valores.add(dados.getDataAg()); //dataag
            valores.add(dados.getStatusAg()); //statusag
            valores.add(area_obs.getText());
            valores.add(jt_cod.getText());

            grava(valores);
            JOptionPane.showMessageDialog(null, "Agendamento alterado com sucesso!");
            dispose();
        } 
    }

【问题讨论】:

  • 这些表单是用哪种编程语言编写的?

标签: java forms updating


【解决方案1】:

我会这样做:

假设,您已经在第二个表单上有“关闭”按钮。

1) 我会将第一个表单发送给第二个表单

 SecondForm second = new SecondForm(this);

或者

SecondForm second = new SecondForm(firstForm);

Second form 的 init 函数会保留 firstForm 实例,当关闭时,我会这样做:

public void actionPerformed(ActionEvent e){
 firstForm.update();
 this.close();
}

很抱歉只发布了一小段代码,但想法是:

  • 在您的第二个表单中存储了第一个表单的实例
  • 通过按钮或右上角的“X”按钮关闭第二个表单时,通过第一个表单 public 更新第一个表单

编辑 我不会说西班牙语(对不起,如果那是另一种语言:)),所以我会做一些假设:tabela 是显示数据的组件。我不是很喜欢 JTable,但仍然有update() 功能。现在该怎么做。我会改变行

new CarregarAgendamento(func.getDados()).setVisible(true); 

new CarregarAgendamento(func.getDados(), this).setVisible(true);

现在,this 指的是第一个表单类。因为我不知道它是怎么称呼的,所以我将它称为FirstForm 进一步。好吗?

所以,CarregarAgendamento是(另一种假设)第二种形式。我会像这样更新init

public class CarregarAgendamento 
//all previous private field
private FirstForm first;

/* Here I assume that the func.getDados() returns Funcoes. If not, change it */
public CarregarAgendamento(Funcoes func, FirstForm f){
 //leave everything as it was, just add the line below
 this.first = f;
}

现在的功能:

private void btn_salvaActionPerformed(java.awt.event.ActionEvent evt) {                                           
    salvarAgendamento(); 
    first.getTabela().update(); //method to update the table. 
    dispose(); 
}                                          

private void btn_deleteActionPerformed(java.awt.event.ActionEvent evt) {                                            
    if(javax.swing.JOptionPane.showConfirmDialog(null,"Deseja realmente Excluir este Agendamento?","ATENÇÃO ",javax.swing.JOptionPane.YES_NO_OPTION )==0) 
    {   
        con_ag = new Firebird(func.fullPath("/db/manutencao.fdb")); 
        con_ag.removeFDB("agendados", "numag", jt_cod.getText()); 
        Agendados.refresh = 1; 
        first.getTabela().update(); //method to update the table. 
        this.dispose();   
    }   

} 

public void salvarAgendamento(){ 
        ArrayList<Object> colunas = new ArrayList<>(); 
        ArrayList<Object> valores = new ArrayList<>(); 
        calendario = new Calendario(); 

        if (jcb_motivo.getSelectedIndex() == -1) 
        { 
            JOptionPane.showMessageDialog(null, "Faltou o Motivo do Agendamento!"); 
            jcb_motivo.requestFocus(); 
        }  
        else if (jt_dataAg.getText().equals("")) 
        { 
            JOptionPane.showMessageDialog(null, "Faltou a Data do Agendamento!"); 
            jt_dataAg.requestFocus(); 
        }  
        else if (dados.getStatusAg() == 0) 
        { 
            JOptionPane.showMessageDialog(null, "Faltou selecionar o Status do Agendamento!"); 
            jcb_status.requestFocus(); 
        } 
        else 
        { 
            calendario.dataFormatada("dd/mm/yyyy", "yyyy-mm-dd", jt_dataAg.getText()); 
            dados.setDataAg(calendario.getDataFormatada() + " 00:00:00"); 

            colunas.add("statusag"); 
            colunas.add("obs"); 

            valores.add(jt_tel1.getText()); 
            valores.add(jt_tel2.getText()); 
            valores.add(jt_cel.getText()); 
            valores.add(dados.getConvenioNum()); //convnum 
            valores.add(dados.getDentistaNum()); //dentnum 
            valores.add(jcb_motivo.getSelectedItem()); 
            valores.add(dados.getDataAg()); //dataag 
            valores.add(dados.getStatusAg()); //statusag 
            valores.add(area_obs.getText()); 
            valores.add(jt_cod.getText()); 

            grava(valores); 
            first.getTabela().update(); //method to update the table. 
            JOptionPane.showMessageDialog(null, "Agendamento alterado com sucesso!"); 
            dispose(); 
        }  
    } 

如前所述 - 我从未使用过 JTable,所以我不知道如何更新它。只是希望它会起作用。显然,您必须将此功能添加到您的 FirstForm 某处:

  public JTable getTabela(){
     return tabela;
  }

如果你还没有

【讨论】:

  • 我添加了加载第二个表单的方法。你能检查一下吗?谢谢
  • 当我点击保存按钮或删除按钮时,我只需要刷新主表单。然后它将应用更改或删除注册并关闭此表单。我正在添加保存和删除操作方法。
  • 非常感谢 Pavel,我没有将第一种形式添加到第二种形式的构造函数中。现在它工作得很好。非常感谢 ;)
猜你喜欢
  • 2010-12-26
  • 2011-05-13
  • 2012-11-14
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
相关资源
最近更新 更多