[RESOLVIDO] Como armazenar valores depois de sair de outra tela

Boa tarde, meu nome é Pablo Henrique!

Estou com o seguinte problema tenho uma Tabela implementada com AbstractTableModel onde listo todas as matérias, e tenho um botão chamado *Alterar, quando seleciono a linha e clico neste botão aparece JFrame interno para alterar os dados, ai tudo bem, só que nesta tela onde tem a tabela queria poder deixar armazenado os seguintes itens: o objeto (matéria) da linha selecionada, o número da linha e da coluna também, só que quando fecho o JFrame Interno esses dados não ficam.

Imagem da tabela:

image

Método do botão alterar:

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

    if (tbMateria.getSelectedRow() > -1) {

        coluna = tbMateria.getSelectedColumn();

        linha = tbMateria.getSelectedRow();
        materia = new ControleMateria().listar().get(linha); // pego as informações da lina e adiciona ao objeto matéria

        TelaMenuMateriaMDI telaMenuMateriaMDI = new TelaMenuMateriaMDI();
        area.add(telaMenuMateriaMDI);

        telaMenuMateriaMDI.setVisible(true);

    } else {
        JOptionPane.showMessageDialog(null, "Selecione a matéria");
    }

}               

Quando eu clico no botão registrar as informações são alteradas no banco de dados corretamente, ai fecho esta janela e fica a janela que tem a tabela, ai uso este método para tentar atualizar a tabela:

  private void formInternalFrameActivated(javax.swing.event.InternalFrameEvent evt) {                                            
   
    tableModel.setValueAt(materia, linha, coluna);

}                                   

Mas este método da erro, o objeto volta como nulo, e a linha e a coluna aparecem com o valor zero.

**Alguém poderia me explicar o motivo disso acontecer, e como poderia contornar este problema

Usa um update… Já tentou?

Como assim? se for o update do banco de dados ele funciona, só que não consigo listar na tabela depois de atualizado

Vê isso se te ajuda;

  public void preencherTabela(String SQL){
            ArrayList dados = new ArrayList();
    
    String[] Colunas = new String[]{"ID","Data","Apartamento","Solicitação" ,"Usuario" ,"Hora" ,"Atendente" ,"Status"};
    
    conecta.executeSQL(SQL);
    
try {
    conecta.resultset.first();
    do{
        dados.add(new Object[]{conecta.resultset.getInt("ID"), conecta.resultset.getString("Data"), conecta.resultset.getString("Apartamento"), conecta.resultset.getString("Solicitação"), conecta.resultset.getString("Usuario") , conecta.resultset.getString("Hora") , conecta.resultset.getString("Atendente") ,conecta.resultset.getString("Status")});
        
    }while(conecta.resultset.next());
} catch (SQLException ex) {
    JOptionPane.showMessageDialog(null,"Não foi possível retornar a pesquisa ");
}
    
   ModeloTabela modelo = new ModeloTabela(dados, Colunas);
   jTable1.setModel(modelo);
   jTable1.getColumnModel().getColumn(0).setPreferredWidth(80);
   jTable1.getColumnModel().getColumn(0).setResizable(false);
   jTable1.getColumnModel().getColumn(1).setPreferredWidth(80);
   jTable1.getColumnModel().getColumn(1).setResizable(false);
   jTable1.getColumnModel().getColumn(2).setPreferredWidth(80);
   jTable1.getColumnModel().getColumn(2).setResizable(false);
  jTable1.getColumnModel().getColumn(3).setPreferredWidth(180);
   jTable1.getColumnModel().getColumn(3).setResizable(false);
   jTable1.getColumnModel().getColumn(4).setPreferredWidth(80);
   jTable1.getColumnModel().getColumn(4).setResizable(false);
   jTable1.getColumnModel().getColumn(5).setPreferredWidth(80);
   jTable1.getColumnModel().getColumn(5).setResizable(false);
   jTable1.getColumnModel().getColumn(6).setPreferredWidth(80);
   jTable1.getColumnModel().getColumn(6).setResizable(false);
   jTable1.getColumnModel().getColumn(7).setPreferredWidth(80);
   jTable1.getColumnModel().getColumn(7).setResizable(false);
   
   jTable1.getTableHeader().setReorderingAllowed(false);
   jTable1.setAutoResizeMode(jTable1.AUTO_RESIZE_OFF);
   jTable1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
       
}

Chama ele assim:

PreencherTabela("select * from Sua_tabela order by Data DESC")

Fiquei um pouco confuso…acho que é isso que vc quer quando cita: “Quando eu clico no botão registrar as informações são alteradas no banco de dados corretamente, ai fecho esta janela e fica a janela que tem a tabela, ai uso este método para tentar atualizar a tabela”

Não sei se é essa sua dúvida, mas se não for SORRY…

Obrigado pela ajuda, mas consegui resolver, só outra coisa como faço para deixar a resposta e marcar que foi resolvido?

disponibiliza a conteúdo da sua solução para compartilhar ela com os demais.

Eu fiz o seguinte dentro do botão alterar quando chama telaMenuMateriaMDI passei para seu construtor a linha, a coluna, e a materia;

    if (tbMateria.getSelectedRow() > -1) {

    coluna = tbMateria.getSelectedColumn();

    linha = tbMateria.getSelectedRow();
    materia = new ControleMateria().listar().get(linha); // pego as informações da lina e adiciona ao objeto matéria

    TelaMenuMateriaMDI telaMenuMateriaMDI = new TelaMenuMateriaMDI(materia, linha, coluna);
    area.add(telaMenuMateriaMDI);

    telaMenuMateriaMDI.setVisible(true);

} else {
    JOptionPane.showMessageDialog(null, "Selecione a matéria");
}

Lá na tela onde faço as alterações dados dentro do Construtor recebo a linha, a coluna e a matéria:
public TelaMenuMateriaMDI(Materia materia, int l, int c) {
initComponents();
this.status = true;
preecnherCampos(materia);
this.materia = materia;
linha = l;
coluna = c;

}

Já no método onde altero as informações fiz o seguinte:

 if (status) {

        String nomeMateria = txtMateria.getText();
        String d = txtData.getText();
        int id = materia.getId();
        
        ControleMateria cMateria = new ControleMateria();
        cMateria.alterar(nomeMateria, getData(d), id); // este método faz alteração dentro do meu banco

        m.setNomeMateria(nomeMateria);
        m.setData(getData(d));

        TelaMenuTabelaMateriaMDI.tableModel.setValueAt(m, linha, coluna);  // neste método que atualiza a tabela 

}

Dentro da minha classe que implementa os Métodos do AbstractTableModel tenho o método responsável por alterar as informações e listar a alteração:
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {

    Materia m = lMateria.get(rowIndex);

    
     // dependendo da coluna retornará o valor corretamente
    switch (columnIndex) {
        case 0:
            m.setId(Integer.parseInt(String.valueOf(aValue)));
            break;
        case 1:
            m.setNomeMateria(String.valueOf(aValue));
            break;
       case 2:
            m.setData((LocalDate) aValue);
            break;

    }
    
    // avisa que os dados mudram e lista novamente a tabela
    fireTableDataChanged();
}
1 curtida