Chamar JButon de um JFrame para outro

5 respostas Resolvido
josues

Olá Bom dia!
Sou iniciante nessa área, e estou com um pequeno probleminha, se poderes me ajudar agradeço…
Tenho dois Frames um é principal § e o outro (B) eu chamo através de um botão.
na tela principal tenho dois botões cadastrar e acessar, quando eu executo a tela principal aparece o botão cadastrar não aparece (isso é intencional) ficando visível apenas o botão acessar, quando clicar no botão acessar ele chama o frame (B) que por fim tem dois botões confirmar e cancelar, ao clicar no botão confirmar ele retorna ao frame principal §, dessa vez com o botão cadastrar visível, mas não tenho ideia de como posso usar o botão cadastrar do frame § no frame (B).

5 Respostas

D

Seria melhor usar o JDialog modal no (B), no botão ficaria:

// isto tem que estar no (P) no botão acessar
dialogB.setModal(true);
dialogB.setVisible(true);
if (dialogB.foiPrecionadoBotaoConfirma()) {
    cadastrar.setVisible(true);
}

// no dialogB no confirmar
this.precionouConfirmar = true;
this.setVisible(false); // ou dispose(), prefiro o setVisible pois depois não será necessário usar o new para abrir novamente

// método no dialogB
boolean precionouConfirmar  = false;
public boolean foiPrecionadoBotaoConfirma() {
  return precionouConfirmar;
}

mas se quiser continuar usando o (B) como JFrame, a opção mais simples (não considero correto), seria fazendo uma classe assim:

class JFrames {
  public static JFrame P;
  public static JFrame B;
}

// no botão acessa
JFrames.P = this; // vai depender de como vc fez, pode ser JFrame.this ou  NOME_DA_CLASSE.this
JFrames.B = B;
B.setVisible(true);

// no botão confirma
JFrames.P.exibirBotaoCadastrar(); // equivalente a JFrames.P.cadastrar.setVisible(true);
josues

Acho q n entendestes minha duvida ou talvez eu tenha sido evasivo, vou exemplificar
frame §
botão cadastrar qdo executo o programa ele vem invisível pois usei [cadastrar.setVisible(false)] no meu construtor.
botão acessar fica visível, pois quando clico nele o frame B aparece (ele já esta implementado).
até ai tudo ok
frame (B)
botão confirmar, quero implementar esse botão, para qdo eu clicar nele o frame § apareça com o botão cadastrar visivel. (esse ja ta implementado para que a tela P apareça) .

e acredito que pra mim fazer isso tenho que criar um metodo em uma classes para que eu tenha permissão para usar a variavel do botão declarada no frame P dentro do frame B e isso eu n estou conseguindo fazer…

D
Solucao aceita

Eu entendi, o que a maioria faz é usar o padrão Observer, mas talvez vc não conheça, então vou dar um exemplo diferente:

classe FrameP extends JFrame() {
  FrameB frameB;
  JButton cadastrar;
  JButton acessar;

  // construtor
  public FrameP() {
    acessar.addActionListener() {
      frameB.setBotaoCadastrar(cadastrar); // entrega o botão cadastrar para que o FrameB possa exibir depois
      frameB.setVisible(true);
    }
  }
}

classe FrameB extends JFrame() {
  JButton cadastrarDoFrameP;
  JButton confirmar;

  // construtor
  public FrameB() {
    confirmar.addActionListener() {
      cadastrarDoFrameP.setVisible(true); // exibe o botão
      // setVisible(false); // fecha o frameB, ou use frameB.dispose(); não sei se precisa fechar
    }
  }
  // atualiza o botão que o confirmar deva exibir
  void setBotaoCadastrar(botao) {
    this.cadastrarDoFrameP = botão;
  }
}

Atenção, isso é um esboço.

josues

ok! obrigado entendi vou tentar fazer aqui qualquer coisa volto com minhas duvidas

josues

Vou enviar o código completo como estou fazendo no netbeans vai ficar um pouco longo…

Essa é a classe Principal q quando clicar no botão Login vai abrir a tela do frame B

public class Principal extends javax.swing.JFrame {

/**
 * Creates new form Principal
 */
public Principal() {
    initComponents();
    JBCadastrar.setVisible(false);
}

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    JBCadastrar = new javax.swing.JButton();
    JBAcessar = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    JBCadastrar.setText("Cadastrar");

    JBAcessar.setText("Acessar");
    JBAcessar.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            JBAcessarActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(147, 147, 147)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                .addComponent(JBCadastrar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(JBAcessar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addContainerGap(172, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(106, 106, 106)
            .addComponent(JBCadastrar)
            .addGap(38, 38, 38)
            .addComponent(JBAcessar)
            .addContainerGap(110, Short.MAX_VALUE))
    );

    setSize(new java.awt.Dimension(416, 338));
    setLocationRelativeTo(null);
}// </editor-fold>                        

private void JBAcessarActionPerformed(java.awt.event.ActionEvent evt) {                                          
    String args [] = new String [1];
    FrameB1.main(args);
    
}                                         

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new Principal().setVisible(true);
        }
    });
}

// Variables declaration - do not modify                     
private javax.swing.JButton JBAcessar;
private javax.swing.JButton JBCadastrar;
// End of variables declaration

}

Essa outra é o Frame
public class FrameB1 extends javax.swing.JFrame {

public class FrameB1 extends javax.swing.JFrame {

/**
 * Creates new form FrameB1
 */
public FrameB1() {
    initComponents();
}

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    JBConfirmar = new javax.swing.JButton();
    JBCancelar = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    JBConfirmar.setText("Confirmar");
    JBConfirmar.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            JBConfirmarActionPerformed(evt);
        }
    });

    JBCancelar.setText("Cancelar");
    JBCancelar.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            JBCancelarActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(70, 70, 70)
            .addComponent(JBConfirmar)
            .addGap(76, 76, 76)
            .addComponent(JBCancelar)
            .addContainerGap(100, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGap(124, 124, 124)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(JBConfirmar)
                .addComponent(JBCancelar))
            .addContainerGap(153, Short.MAX_VALUE))
    );

    setSize(new java.awt.Dimension(416, 338));
    setLocationRelativeTo(null);
}// </editor-fold>                        

private void JBConfirmarActionPerformed(java.awt.event.ActionEvent evt) {                                            
    String args [] = new String [1];
    Principal.main(args);
    dispose();
}                                           

private void JBCancelarActionPerformed(java.awt.event.ActionEvent evt) {                                           
    dispose();
}                                          

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /* Set the Nimbus look and feel */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(FrameB1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(FrameB1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(FrameB1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(FrameB1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /* Create and display the form */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new FrameB1().setVisible(true);
        }
    });
}

// Variables declaration - do not modify                     
private javax.swing.JButton JBCancelar;
private javax.swing.JButton JBConfirmar;
// End of variables declaration

}

Então, observa q no primeiro frame eu deixei o botão cadastrar invisivel
e quando eu clicar em acessar vai chamar a tela do frameB1
e quando eu acionar o botão confirmar vai fechar a janela do frameB1 chamando de volta o frame principal ja com o botão cadastrar visível. mas eu não estou conseguindo fazer isso…

Desculpe está te alugando mas eu queria aprender essa parte…

Criado 27 de outubro de 2017
Ultima resposta 27 de out. de 2017
Respostas 5
Participantes 2