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).
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);
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…
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.
ok! obrigado entendi vou tentar fazer aqui qualquer coisa volto com minhas duvidas
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…