Passar variável para MDIFilha [Resolvido]

Olá colegas,
Estou com um probleminha para uma MDIFilha receber uma variável de outra MDIFilha. Em uma das mdi’s eu listo todo os usuários do banco em um TableModel e a edição desse usuário deve acontecer na outra mdi que faz o edição/cadastro de usuário.
Estou usando o pattern DAO no projeto e não encontro uma forma para fazer essa implementação.

Alguém se habilita??

valew!!

OK! Vc tem uma MDIFilha1 e quer passar variaveis para a MDIFilha2, correto?

Pergunta: A MDIFilha1 chama MDIFilha2?
Se sim, basta passar as variaveis (da MDIFilha1) para MDIFilha2 através da chamada que MDI1 faz para abrir a janela da MDI2.
No construtor de MDI2, crie mais um campo de parametro que corresponda a variavel que vc quer trazer de MDI1 … e quando MDI1 for chamar o contrutor de MDI2, passe a variavel pelo construtor. Assim vc ficará livre para utiliza-la em toda MDI2.

Agora se as duas janelas já estiverem abertas, aí não sei.

Alguém tem ideia melhor?

Sem uma referência para a outra janela não tem como fazer, a menos que utilize um método estático (arrrrrghhhh!), mas isso afetaria todas as instâncias dessa janela que estiverem abertas.

Idéia: Crie uma interface que será implementada pela janela 2 e quando for criar a janela 1 coloque no construtor para receber um objeto que implementa essa interface, nesse caso do desacopla as janelas e consegue manipular qualquer janela que implemente a interface podendo passar os valores por meio de um método declarado na interface por exemplo.
Pelo menos é assim que faço nos meus projetos.

crie uma classe static e passe o valor para ela por um MDI e pegue nela pelo outro

Esse seria o jeito mais fácil, porém … como nosso outro amigo disse, ao criar variáveis static vc afeta todas as janelas! Fora o fato de que vc, teoricamente, estará disponibilizando uma informação (a variavel em questão) para todas as outras classes, sim pq teoricamente qualquer classe poderia implementar a classe estatic e utilizar dessa informação, o que vai contra a segurança da informação, e tbm não sabemos se sua regra de negócio permite isso … imagine se essa variavel, por exemplo, for uma senha ou algo assim, seria totalmente errado colocá-la em uma variavel public e/ou static.

Abraços.

É isso mesmo que eu quero lucas, mas não entendi como vou passar essa variável da MDIFilha1(form com todos os usuários do sistema) para a MDIFilha2(form de cadastro/edição de usuário).
O código que uso na MDIFIlha1 para abrir a MDIFilha2 esta assim…

private GUICadastrarUsuario cadastrarUsuario;
private void jButtonAlterarActionPerformed(java.awt.event.ActionEvent evt) {
        if ((cadastrarUsuario == null) || (!cadastrarUsuario.isVisible())) {
            cadastrarUsuario = new GUICadastrarUsuario();
            this.getParent().add(cadastrarUsuario);
            cadastrarUsuario.setPosicao();
            cadastrarUsuario.setVisible(true);
        }
        try {
            cadastrarUsuario.setSelected(true);
        } catch (PropertyVetoException exc) {
            JOptionPane.showMessageDialog(null,"Não foi possível selecionar a janela de edição de usuário!\nMotivo: " + exc.getMessage());
        }
    }

Então, no construtor do cadastrarUsuario = new GUICadastrarUsuario();, você vai colocar cadastrarUsuario = new GUICadastrarUsuario(variavelQueVoceQuerPassar); ; e não se esqueça de alterar o construtor na classe MDIFilha2, ou seja, GUICadastrarUsuario. Aí, ainda na GUICadastrarUsuario, você pega essa variável e atribui ela a uma propriedade. Simples?

Qualquer dúvida é dsó postar.
XD

Bom dia a todos.

[quote=H3nrique]Olá colegas,
Estou com um probleminha para uma MDIFilha receber uma variável de outra MDIFilha. Em uma das mdi’s eu listo todo os usuários do banco em um TableModel e a edição desse usuário deve acontecer na outra mdi que faz o edição/cadastro de usuário.
Estou usando o pattern DAO no projeto e não encontro uma forma para fazer essa implementação.

Alguém se habilita??

valew!![/quote]

Eu tenho uma sugestão melhor.

Crie uma classe “Bean”, ou seja, uma classe com uma estrutura da tabela usuário com métodos getters e setters, onde quando voce ao clicar na linha de registro do seu tablemodel na MDIFilha1, popule esse bean através dos setters, e passe-o através do construtor da MDIFilha2, e nela voce recupera todos os dados do registro clicado através dos getters.

Cappichi

Boa noite,
Discorpio, para ser sincero não entendi o que devo fazer.
Esta é minha classe bean Login (http://pastebin.com/XNtccb7Y), a classe dao (http://pastebin.com/UemxveKh) e a MDIFilha1 (http://pastebin.com/C8YSWqCw)
Quando listo todos os usuários do sistema na MDIFilha1, crio uma instância da bean, (LoginDao dao = new LoginDao():wink: seto os valores e faço a consulta no banco. Se eu setar o valor na MDIFilha1 dessa mesma, eu irei conseguir recuperar na MDIFilha2? Como?

Boa noite a todos.

Na verdade era essa classe Login populada que voce deveria passar para a MDIFilha2.

O problema é que voce está usando "DefaultTableModel" para popular o seu JTable. O DefaultTableModel engenssa o desenvolver a um tipo de tabela padrão e não permite voce dinamizá-lo. Já com AbstractTableModel, permite voce criar uma modelagem de tabela para JTable, ao seu gosto, inclusive popular o JTable dentra dela, vamos a um exemplo:

import javax.swing.table.AbstractTableModel;
import java.util.List;
br.com.pauloh3nrique.logica;

public class UsuarioModel extends AbstractTableModel {

    private List<Login> dataset;
    private static final String[] col = {"ID","Nome","Usuário"};

    public UsuarioModel(List<Login> usuarios){
        dataset = new ArrayList<Login>(usuarios);
        fireTableStructureChanged();
    }

    public int getRowCount() {
        return dataset.size();
    }

    public int getColumnCount() {
        return col.length;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        Login user = dataset.get(rowIndex);
        Object[] row = {
               user.getId(),
               user.getNome(),
               user.getUsuario()
        };
        return row[columnIndex];
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex){
       return false;
    }

    public List<Login> getUsuarios(){
       return dataset;
    }

    @Override
    public String getColumnName(int column){
        return col[column];
    }

    public Login getRow(int row) {
         return dataset.get(row);
    }

}

Agora lâ no método ListarUsuarios da MDIFilha1, popule o JTable assim:

private void listarUsuarios() throws SQLException {
      LoginDao dao = new LoginDao();
      usuarios = dao.getUsuarios();
      if (usuarios.isEmpty()) {
           JOptionPane.showMessageDialog(null, "Nenhum usuário encontrado!");
      } else {
           tmUsuarios.setModel(new UsuarioModel(usuarios));
      }
}

Pronto, agora voce abilitou o seu JTable a retornar um classe Login totalmente populada através do seu Método getRow(), o qual ao se clicar em cima da linha do seu JTable, voce pode ao mesmo tempo instanciar a MDIFilha2, passando o valor do método getRow(), onde dentro do construtor da MDIFilha2, voce cria uma passagem de parâmento do tipo Login. Ex.:

// Classe MDIFilha2
public class GUICadastrarUsuario extends javax.swing.JInternalFrame {
        
        private Login usuario;

        public GUICadastrarUsuario(Login usuario){
               this.usuario = usuario;
        }
        
        .....
        .....
}

// Chamada a classe MDIFilha2
private GUICadastrarUsuario cadastrarUsuario;   
private void jButtonAlterarActionPerformed(java.awt.event.ActionEvent evt) {
        UsuarioModel usermodel = (UsuarioModel)tmUsuarios.getModel();
        Integer rowuser = tmUsuarios.getSelectedRow();
        if (rowuser < 0){
            JOptionPane.showMessageDialog(null,"Selecione uma linha do JTable");    
        } else if ((cadastrarUsuario == null) || (!cadastrarUsuario.isVisible())) {   
            cadastrarUsuario = new GUICadastrarUsuario(usermodel.getRow(rowuser));   
            this.getParent().add(cadastrarUsuario);   
            cadastrarUsuario.setPosicao();   
            cadastrarUsuario.setVisible(true);   
        }   
        try {   
            cadastrarUsuario.setSelected(true);   
        } catch (PropertyVetoException exc) {   
            JOptionPane.showMessageDialog(null,"Não foi possível selecionar a janela de edição de usuário!\nMotivo: " + exc.getMessage());   
        }   
    }  

Espero ter ajudado.

discorpio,
Fico muito grato pela sua ajuda… consegui fazer o que queria graças ao seu help…

Para jogar os valores nos campos fiz assim.

public GUICadastrarUsuario(Login usuario) {
        initComponents();
        this.login = usuario;
        tfNome.setText(login.getNome());
        tfUsuario.setText(login.getUsuario());
}

Bom dia H3nrique.

Fico feliz em ter ajudado.

Só não se esqueça de colocar [Resolvido] no post inicial.

Um abraço.