Passar variável para MDIFilha [Resolvido]

11 respostas
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!!

11 Respostas

LucasRey

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?

laudenpower

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.

E

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

LucasRey

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.

H3nrique

É 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());
        }
    }
LucasRey

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

discorpio

Bom dia a todos.

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!!

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

H3nrique

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?

discorpio

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.

H3nrique

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());
}
discorpio

Bom dia H3nrique.

Fico feliz em ter ajudado.

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

Um abraço.

Criado 17 de setembro de 2010
Ultima resposta 22 de set. de 2010
Respostas 11
Participantes 5