Jframe chamando outro Jframe + passagem de parâmetros

7 respostas
_

Olá.

Alguem tem um exemplo de como faço para dois Jframe conseguirem interagir entre si.

Por exemplo, terei um Jframe principal, mas antes de abrir esse JframePrincipal eu preciso chamar outro JFrame que será aonde o usuário informará dados de conexão.

Então quando o usuário clicar em OK nesse JFrameAuxiliar(da conexão), terei que popular um objeto que está no JFramePrincipal, tem como fazer isso?

Algum exemplo.

vlw

7 Respostas

R

crie uma classe que se responsabilize pela passagem de valores com metodos getters e setters
quando o usuario clicar em ok passe os valores que desejar como parametros para o metodo setter
e no formulario principal para recuperar os valores use os getters

ex:
public class passaValor {

    private String Nome;

    public void setNome(String nome) {
        this.Nome = nome;
    }

    public String getNome() {
        return Nome;
    }
}
supondo que no primeiro formulario vc queira passar o nome pro segundo vc faria
public class Form1 {

    passaValor nome = new passaValor();

    public void Form1() {
        nome.setNome("João");
    }
}

e no segundo form

public class Form2 {

    passaValor nome = new passaValor();

    public void Form2() {
        System.out.println(nome.getNome());
    }
}

claro que isso e so um exmplo bem basico se vc roda nao ira funcionar pois nao tem um metodo main
mas e basicamente isso

_

Mas como que eu faço pra ter um mesmo objeto, no exemplo que você passou, são criados dois objetos distintos. Para o meu caso, eu precisaria que fosse criado somente um objeto Conexão na classe do JFramePrincipal e esse objeto fosse populado dentro do meu JFrameAuxiliar(o que irá ser chamado pelo JFramePrincipal) ?

ViniGodoy

Segue um exemplo:

E é melhor usar um JFrame e um JDialog. Assim vc não deixa o usuário voltar ao JFrame enquanto ele não fechar a janela da conexão.

jMarcel

ViniGodoy:
Segue um exemplo:

E é melhor usar um JFrame e um JDialog. Assim vc não deixa o usuário voltar ao JFrame [color=orange]enquanto ele não fechar a janela da conexão[/color].

Vide abaixo…

jMarcel

Já vi seu código de exemplo, mas não consegui adaptar para meu projeto, já que [color=orange]minha janela será fechada caso haja validação[/color]:

  • Informa-se o login e senha em um LoginDialog;
  • clica-se em um JButton e faz-se a validação no BD (via DAO);
  • se ok --> ‘LoginDialog.setVisible(false)’ e ‘MainDialog.setVisible(true)’;
  • quero que aquele ‘login’ informado no ‘LoginDialog’ ([color=orange]agora não mais visível[/color]) validado com sucesso apareça em um ‘JLabel’ do ‘MainDialog’.

Criei o seguinte método no MainDialog:

protected void pegaLogin() {
        loginDialog d = new loginDialog(null, true);
        if (!(d.isShowing())) { // tentei usar outros métodos boolean aqui. teria que ser semelhante ao seu alterarDados ?
        lblGetUser.setText((d.getNome())); // o método getNome está no LoginDialog (veja abaixo)
        System.out.print("login informado: " + d.getNome()); // para verificar a saída/resultado
        }
        d.dispose(); //  usei setVisible(true/false), não resolve
    }

Método no LoginDialog:

public String getNome() {
        return (txtLogin.getText());
    }

Dúvidas:

  1. ao contrário do dispose(), o setVisible() oculta o conteiner, mas os ‘dados’ do objeto ainda ficam na memória, é isso ?

  2. coloquei o pegaLogin() no construtor do MainDialog, mas ao acessar o LoginDialog(), tem-se estouro da pilha (java.lang.StackOverflowError) relacionado ao BD.

  3. depois tentei usá-lo no método de validação na classe LoginDialog ‘usrDAO.isValidUserAndPassword’ (vide abaixo), mas sem sucesso;

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

        try {
            boolean valid = usrDAO.isValidUserAndPassword(txtLogin.getText(), txtPassword.getText());
            if (!valid) {
            JOptionPane.showMessageDialog(this, "Login e/ou senha incorreto(s) !", "Login/Senha inválidos !", JOptionPane.ERROR_MESSAGE);
            return;
            }
            setVisible(false);
            g.setVisible(true);
            g.pegaLogin(); // local análogo ao do seu exemplo, ou seja, dentro de um 'ActionPerformed()'
            System.out.print(txtLogin.getText()); // é retornado apenas quando encerro o 'MainDialog'
        } catch (SQLException ex) {
            Logger.getLogger(loginDialog.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
  1. por fim, coloquei o pegaLogin() em ‘loadInitialUsers()’ do MainDialog, mas não funcionou.

Tenho outras idéias, mas prefiro lhe perguntar: O que eu faço ??

obs.: nenhuma das classes (MainDialog / LoginDialog) possui o método main().

jMarcel

jMarcel:
Já vi seu código de exemplo, mas não consegui adaptar para meu projeto, já que [color=orange]minha janela será fechada caso haja validação[/color]:

  • Informa-se o login e senha em um LoginDialog;
  • clica-se em um JButton e faz-se a validação no BD (via DAO);
  • se ok --> ‘LoginDialog.setVisible(false)’ e ‘MainDialog.setVisible(true)’;
  • quero que aquele ‘login’ informado no ‘LoginDialog’ ([color=orange]agora não mais visível[/color]) validado com sucesso apareça em um ‘JLabel’ do ‘MainDialog’.

Criei o seguinte método no MainDialog:

protected void pegaLogin() {
        loginDialog d = new loginDialog(null, true);
        if (!(d.isShowing())) { // tentei usar outros métodos boolean aqui. teria que ser semelhante ao seu alterarDados ?
        lblGetUser.setText((d.getNome())); // o método getNome está no LoginDialog (veja abaixo)
        System.out.print("login informado: " + d.getNome()); // para verificar a saída/resultado
        }
        d.dispose(); //  usei setVisible(true/false), não resolve
    }

Método no LoginDialog:

public String getNome() {
        return (txtLogin.getText());
    }

Dúvidas:

  1. ao contrário do dispose(), o setVisible() oculta o conteiner, mas os ‘dados’ do objeto ainda ficam na memória, é isso ?

  2. coloquei o pegaLogin() no construtor do MainDialog, mas ao acessar o LoginDialog(), tem-se estouro da pilha (java.lang.StackOverflowError) relacionado ao BD.

  3. depois tentei usá-lo no método de validação na classe LoginDialog ‘usrDAO.isValidUserAndPassword’ (vide abaixo), mas sem sucesso;

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

        try {
            boolean valid = usrDAO.isValidUserAndPassword(txtLogin.getText(), txtPassword.getText());
            if (!valid) {
            JOptionPane.showMessageDialog(this, "Login e/ou senha incorreto(s) !", "Login/Senha inválidos !", JOptionPane.ERROR_MESSAGE);
            return;
            }
            setVisible(false);
            g.setVisible(true);
            g.pegaLogin(); // local análogo ao do seu exemplo, ou seja, dentro de um 'ActionPerformed()'
            System.out.print(txtLogin.getText()); // é retornado apenas quando encerro o 'MainDialog'
        } catch (SQLException ex) {
            Logger.getLogger(loginDialog.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
  1. por fim, coloquei o pegaLogin() em ‘loadInitialUsers()’ do MainDialog, mas não funcionou.

Tenho outras idéias, mas prefiro lhe perguntar: O que eu faço ??

obs.: nenhuma das classes (MainDialog / LoginDialog) possui o método main().

Já resolvi. Quem quiser, veja a solução em: http://www.coderanch.com/t/536083/GUI/java/Accessing-data-between-JDialogs#2432312

T
RDG87:
crie uma classe que se responsabilize pela passagem de valores com metodos getters e setters quando o usuario clicar em ok passe os valores que desejar como parametros para o metodo setter e no formulario principal para recuperar os valores use os getters ex:
public class passaValor {

    private String Nome;

    public void setNome(String nome) {
        this.Nome = nome;
    }

    public String getNome() {
        return Nome;
    }
}
supondo que no primeiro formulario vc queira passar o nome pro segundo vc faria
public class Form1 {

    passaValor nome = new passaValor();

    public void Form1() {
        nome.setNome("João");
    }
}

e no segundo form

public class Form2 {

    passaValor nome = new passaValor();

    public void Form2() {
        System.out.println(nome.getNome());
    }
}

claro que isso e so um exmplo bem basico se vc roda nao ira funcionar pois nao tem um metodo main
mas e basicamente isso

Olá colegas,

Quando estancio a classe no form 2,o netbeans diz que uma instância fechada que contém testes.view.Inicio.passaValor é necessário:

an enclosing instance that contains teste.view.Inicio.passaValor is required

passaValor nome = new passaValor();

Por favor, poderia me ajudar?

Obrigado

Criado 11 de abril de 2011
Ultima resposta 8 de set. de 2013
Respostas 7
Participantes 5