[Dúvida] Inserir Dados em um Formulário, e atualizar na JTable de outro! [RESOLVIDO]

5 respostas
Nicolas_Fernandes

Fala, pessoal do GUJ!

Tudo beleza??

Estou com um pequeno probleminha…
Creio que vocês podem me ajudar! rs

É o seguinte… Tenho uma Tela Manager. Ela possui alguns botões para cadastro, alteração, remoção e tals.

Olha ela aí:

public class MaquinasManageDialog extends BaseManageDialog {  
      
    private JTextField pesquisaTextBox;  
  
    public MaquinasManageDialog() {  
  
        this.setTitle(".: Gerenciamento de Máquinas :.");  
  
        this.initComponents();  
    }  
  
    @Override  
    public void initComponents() {  
  
        super.initComponents();  
  
        super.labelList.add(new JLabel("Digite o nome da máquina:"));  
          
        this.pesquisaTextBox = new JTextField(15);  
        super.componentList.add(this.pesquisaTextBox);  
  
        this.setTableModel();  
    }  
  
    @Override  
    public void pesquisarButton_onClick(ActionEvent e) {  
  
        try {  
  
            ((MaquinasTableModel) super.tableModel).list(new Maquina());  
        }  
        catch (Exception anyError) {  
  
        }  
    }  
  
    @Override  
    public void inserirButton_onClick(ActionEvent e) {  
  
        // Aqui é onde a tela de cadastros é instanciada!
        BaseDialog mfd = new MaquinasFormDialog();  
        mfd.showDialog();  

        // Devo fazer alguma coisa aqui? Retornar algum valor?
    }  
  
    @Override  
    public void alterarButton_onClick(ActionEvent e) {  
        throw new UnsupportedOperationException("Not supported yet.");  
    }  
  
    @Override  
    public void removerButton_onClick(ActionEvent e) {  
        throw new UnsupportedOperationException("Not supported yet.");  
    }  
  
    @Override  
    public void setTableModel() {  
  
        List<Maquina> maquinas = new ArrayList<Maquina>();  
  
        maquinas.add(new Maquina(new Long(1), "Máquina 1"));  
        maquinas.add(new Maquina(new Long(2), "Máquina 2"));  
        maquinas.add(new Maquina(new Long(3), "Máquina 3"));  
        maquinas.add(new Maquina(new Long(4), "Máquina 4"));  
        maquinas.add(new Maquina(new Long(5), "Máquina 5"));  
  
        super.tableModel = new MaquinasTableModel(maquinas);  
        super.itensTable.setModel(super.tableModel);  
    }  
}

Beleza…

Daí, eu tenho uma tela de cadastro de máquinas, no caso!

public class MaquinasFormDialog extends BaseFormDialog {  
  
    private Maquina    maquina;  
  
    private JTextField codigoMaquinaTextBox;  
    private JTextField nomeMaquinaTextBox;  
  
    public MaquinasFormDialog() {  
  
        this.setTitle(".: Cadastro de Máquinas :.");  
  
        this.initComponents();  
    }  
  
    @Override  
    public void initComponents() {  
  
        super.initComponents();  
          
        super.labelList.add(new JLabel("Código da Máquina:"));  
        super.labelList.add(new JLabel("Nome da Máquina:"));  
  
        this.codigoMaquinaTextBox = new JTextField(5);  
        super.componentList.add(this.codigoMaquinaTextBox);  
  
        this.nomeMaquinaTextBox = new JTextField(15);  
        super.componentList.add(this.nomeMaquinaTextBox);  
    }  
  
    @Override  
    public void confirmarButton_onClick(ActionEvent e) {  
  
        this.maquina = new Maquina();  
  
        this.maquina.setId(new Long(this.codigoMaquinaTextBox.getText().toString()));  
        this.maquina.setNome(this.nomeMaquinaTextBox.getText().toString());  
  
        // Como chamar aqui o TableModel lá da JTable presente na classe Manager?  
    }  
  
    @Override  
    public void cancelarButton_onClick(ActionEvent e) {  
  
        try {  
            dispose();  
        }  
        catch (Exception anyError) {  
  
            JOptionPane.showMessageDialog(this, anyError.getMessage());  
        }  
    }

No meu MaquinasTableModel, tenho o seguinte método:

public void insert(Maquina maquina) throws Exception {  
  
        this.maquinas.add(maquina);  
        // Adiciona o objeto máquina no banco.  
        this.fireTableRowsInserted(this.maquinas.size(), this.maquinas.size());  
    }

Beleza… Mas, como posso fazer para, na minha tela de Cadastro, chamar o método insert, visto que ele pertence ao TableModel de uma JTable presente lá na minha tela Manager?

Desde já, grato pela atenção de vocês!

[]s

5 Respostas

ViniGodoy
Seu Dialog é modal, certo? Então faça o seguinte:
public class MaquinasFormDialog extends BaseFormDialog {    

     private confirmou = false; //Indica se o usuário apertou ok.     
     private Maquina    maquina;    
     
     private JTextField codigoMaquinaTextBox;    
     private JTextField nomeMaquinaTextBox;    
     
     public MaquinasFormDialog() {    
     
         this.setTitle(".: Cadastro de Máquinas :.");    
         this.initComponents();    
     }    
     
     @Override    
     public void initComponents() {    
     
         super.initComponents();    
             
         super.labelList.add(new JLabel("Código da Máquina:"));    
         super.labelList.add(new JLabel("Nome da Máquina:"));    
     
         this.codigoMaquinaTextBox = new JTextField(5);    
         super.componentList.add(this.codigoMaquinaTextBox);    
     
         this.nomeMaquinaTextBox = new JTextField(15);    
         super.componentList.add(this.nomeMaquinaTextBox);    
     }    
     
     @Override    
     public void confirmarButton_onClick(ActionEvent e) {    
     
         this.maquina = new Maquina();    
     
         this.maquina.setId(new Long(this.codigoMaquinaTextBox.getText().toString()));    
         this.maquina.setNome(this.nomeMaquinaTextBox.getText().toString());    
     
         confirmou = true;
         dispose();
     }    
     
     @Override    
     public void cancelarButton_onClick(ActionEvent e) {    
     
         try {    
             dispose();    
         }    
         catch (Exception anyError) {    
     
             JOptionPane.showMessageDialog(this, anyError.getMessage());    
         }
     } 

     public Maquina getMaquina() {
         return maquina;
     }

     public boolean isConfirmou() {    
        return confirmou;
     }
}
Então, no método inserir da outra tela:
@Override    
     public void inserirButton_onClick(ActionEvent e) {    
     
         // Aqui é onde a tela de cadastros é instanciada!  
         BaseDialog mfd = new MaquinasFormDialog();    
         mfd.showDialog();    
   
         if (!mfd.isConfirmou())
            return;
         super.tableModel.insert(mfd.getMaquina());
     }

O ideal é que dialogs não chamem métodos de outras telas diretamente. Isso as mantém desacopladas. O que dialogs devem fazer é permitir algum tipo de escolha, e retornar o que foi escolhido como parâmetro, como fiz ali em cima. ;)

Nicolas_Fernandes

Vini,

Tentei dessa maneira que você disse, só que nesse trecho:

public void inserirButton_onClick(ActionEvent e) {      
        
       BaseDialog mfd = new MaquinasFormDialog();      
       mfd.showDialog();      
  
       if (!mfd.isConfirmou())  
          return;  
       super.tableModel.insert(mfd.getMaquina());  
   }

O objeto mfd simplesmente não reconhece os métodos isConfirmou() e getMaquina()!

O que pode ser?

[]s

ViniGodoy

Ao invés de criar assim:

BaseDialog mfd = new MaquinasFormDialog();

Crie assim:

MaquinasFormDialog mfd = new MaquinasFormDialog();
Nicolas_Fernandes

Deu certinho! Valeu :smiley:

ViniGodoy

Talvez fosse uma boa você colocar métodos como isConfirmou() no seu BaseDialog. Também é legal alterar o método showDialog() para retornar esse boolean, já que isso poupa um pouco de código.

Esse seria um boneco do que poderia ser adicionado:

public classe BaseDialog extends JDialog {
   private boolean confirmou = false;

   protected void confirmar() {
      confirmou = true;
      dispose();
   }

   protected void cancelar() {
      dispose();
   }

   public boolean isConfirmou() {
      return confirmou;
   }

   public boolean showDialog() {
      confirmou = false;
      setVisible(true);
      return confirmou;
   }
}
Assim, vc poderia simplificar o código das filhas:
@Override      
      public void confirmarButton_onClick(ActionEvent e) {      
        
          this.maquina = new Maquina();      
        
          this.maquina.setId(new Long(this.codigoMaquinaTextBox.getText().toString()));      
          this.maquina.setNome(this.nomeMaquinaTextBox.getText().toString());      

          confirmar();
      }

Ou de quem usa:

@Override      
public void inserirButton_onClick(ActionEvent e) {      
     
    // Aqui é onde a tela de cadastros é instanciada!    
    BaseDialog mfd = new MaquinasFormDialog();      
    if (!mfd.showDialog())   
       return;  
    super.tableModel.insert(mfd.getMaquina());  
}
Criado 3 de novembro de 2009
Ultima resposta 3 de nov. de 2009
Respostas 5
Participantes 2