Comunicação entre jFrames independentes. [RESOLVIDO]

16 respostas
L

Estou fazendo meu TCC (um programa de controle de estoque ) pelo NetBeans 6.8, e nele tem um jFrame TelaPrincipal no pacote home onde tenho varios menus e um deles acessa um outro jFrame do pacote utilitarios chamado Config onde nele tenho opções de resize do jFrame TelaPrincipal.

//Resumindo...
import home.*; 
import java.awt.event.*;
public class Config extends javax.swing.JFrame 
{
    TelaPrincipal home = new TelaPrincipal();
...
 private void [b]jButton_aplicar[/b]ActionPerformed(java.awt.event.ActionEvent evt) { //Botão aplicar
//Preciso de algo assim, mas só o home.setVisible(true) funciona abrindo um novo TelaPrincipal,
//mas quero que feche o jFrame TelaPrincipal 1º e depois inicie um novo.
home.setVisible(false);//não funciona esse comando ou o home.dispose();
home.setVisible(true);

Agora começa o problema… após dar o resize, tenho que fechar o jFrame TelaPrincipal e inicia-lo novamente feito pelo botão Aplicar do jFrame Config.

Estava vendo algo sobre Window Listeners mas não sei se é o caminho.

Quem puder me dar uma luz no fim do tunel, agradeço eternamente.

Leandro D. Mussio

16 Respostas

rodrigoalmeida

O Jframe é encerrado por que o defaultCloseOperation está setado com EXIT_ON_CLOSE ou DISPOSE, mude para HIDE.

Anime

Oi,

Não entendi muito bem,veja como está o main das classes.

O nome da sua classe é home…se for ok…mas parece que entendi que o pacote é que é o home,ai vc tem que chamar a classe e não o pacote…

Eric_Yuzo

Também não entendi direito o que você quer fazer. Mas o código postado está ocultando e exibindo o mesmo JFrame. Não está sendo criado um novo.

L

O que na verdade estou tentando fazer é dar o comando de fechar um jFrame apartir de outro. Porém cada um esta numa classe diferente.

rdgse: Tentei por defaultCloseOperation como HIDE mas da na mesma. É como se quando saio do jFrame TelaPrincipal e vou para o jFrame Conf, o Conf não tem nenhuma relação com o TelaPrincipal, tanto quando tento usar o home.setVisible(true), ele abre um novo TelaPrincipal, desconsiderando o anterior.

Obs: esse home do home.setVisible veio do TelaPrincipal home = new TelaPrincipal(); que creio q serve para me referir a outra classe.

package home;

import utilitarios.*;
import cadastros.*;
import javax.swing.*;
import java.awt.Toolkit;

public class TelaPrincipal extends javax.swing.JFrame {

    data mostra_data;
    String set_look = "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel";





    public TelaPrincipal() {
        initComponents();
        jMenuItem_tema_nimbus.setEnabled(false);


//Maximizar tela
        maximizar();
//
        
        mostra_data = new data();
        mostra_data.le_data();
        jLabel_data.setText(mostra_data.dia_semana + ", " + mostra_data.dia + " de " +mostra_data.mes + " de " + mostra_data.ano);

        mostra_data.le_hora();
        jLabel_hora.setText("Hora atual: " + mostra_data.hora);
        timer1.start();
        LookAndFeel();
 private void initComponents() {
...
}

   public void maximizar()
    {
        Toolkit tool = Toolkit.getDefaultToolkit();
        this.setSize(tool.getScreenSize());
    }
    private void timer1OnTime(java.awt.event.ActionEvent evt) {                              
        mostra_data.le_hora();
        jLabel_hora.setText("Hora atual: " + mostra_data.hora);
        mostra_data.le_data();
        jLabel_data.setText(mostra_data.dia_semana + ", " + mostra_data.dia + " de " +mostra_data.mes + " de " + mostra_data.ano);
    }                             

    private void jButton_sairActionPerformed(java.awt.event.ActionEvent evt) {                                             
        System.exit(0);
    }                                            

    private void jMenu5MouseClicked(java.awt.event.MouseEvent evt) {                                    
        System.exit(0);
    }                                   

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

//Adiciona o JInternalFrame clientes() da classe clientes do pacote cadastros no jDesktopPane.

        clientes jIntF_clientes = new clientes();//
        jDesktopPane1.add(jIntF_clientes);//Injeta o Frame no ambiente
        jIntF_clientes.setVisible(true);//Mostra a tela no ambiente.
        jIntF_clientes.setSize(500, 300);//Ajusta o tamanho da tela no ambiente.
     
    }                                                         

    private void jMenu4ActionPerformed(java.awt.event.ActionEvent evt) {                                       
        Config configs = new Config();
        configs.setVisible(true);
}                                      

    private void jMenuItem_tema_windowsClassicActionPerformed(java.awt.event.ActionEvent evt) {                                                              
        set_look = "com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel";
        LookAndFeel();
        ResetTema();
        jMenuItem_tema_windowsClassic.setEnabled(false);
}                                                             

    private void jMenuItem_tema_windowsActionPerformed(java.awt.event.ActionEvent evt) {                                                       
        set_look = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
        LookAndFeel();
        ResetTema();
        jMenuItem_tema_windows.setEnabled(false);
}                                                      

    private void jMenuItem6_tema_motifActionPerformed(java.awt.event.ActionEvent evt) {                                                      
        set_look = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
        LookAndFeel();
        ResetTema();
        jMenuItem6_tema_motif.setEnabled(false);
}                                                     

    private void jMenuItem_tema_nimbusActionPerformed(java.awt.event.ActionEvent evt) {                                                      
        set_look = "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel";
        LookAndFeel();
        ResetTema();
        jMenuItem_tema_nimbus.setEnabled(false);
}                                                     

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        Config configs = new Config();
        configs.setVisible(true);
        
    }                                          

    private void jButtonTestActionPerformed(java.awt.event.ActionEvent evt) {                                            
       
    }                                           
                     

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TelaPrincipal().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton jButtonTest;
    private javax.swing.JButton jButton_sair;
    private javax.swing.JDesktopPane jDesktopPane1;
    private javax.swing.JLabel jLabel_data;
    private javax.swing.JLabel jLabel_hora;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenu jMenu3;
    private javax.swing.JMenu jMenu4;
    private javax.swing.JMenu jMenu5;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem6_tema_motif;
    private javax.swing.JMenuItem jMenuItem_cadastro_client;
    private javax.swing.JMenuItem jMenuItem_cadastro_func;
    private javax.swing.JMenuItem jMenuItem_tema_nimbus;
    private javax.swing.JMenuItem jMenuItem_tema_windows;
    private javax.swing.JMenuItem jMenuItem_tema_windowsClassic;
    private javax.swing.JMenu jMenu_help;
    private javax.swing.JMenu jMenu_temas;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JSeparator jSeparator1;
    private org.netbeans.examples.lib.timerbean.Timer timer1;
    // End of variables declaration

    private void LookAndFeel()
    {
                try
        {
            UIManager.setLookAndFeel(set_look);
            //com.sun.java.swing.plaf.gtk.GTKLookAndFeel
            //com.sun.java.swing.plaf.motif.MotifLookAndFeel
            //com.sun.java.swing.plaf.windows.WindowsLookAndFeel
            //com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel

            SwingUtilities.updateComponentTreeUI(this);
        }
        catch(Exception erro)
        {
            JOptionPane.showMessageDialog(null,erro);
        }
    }

    private void ResetTema()
    {
        jMenuItem_tema_windows.setEnabled(true);
        jMenuItem_tema_windowsClassic.setEnabled(true);
        jMenuItem_tema_nimbus.setEnabled(true);
        jMenuItem6_tema_motif.setEnabled(true);
    }
}
Anime
new nomeDaClasse().setVisible(true);//aq vc coloca o nome da classe que quer abrir
        dispose();

Faça isso no botão da classe que está em uso…

Tenho que sair…se até amanha vc não tiver resolvido,ai ajudo…

abs…

L

Obrigado Anime, até amanha.

^^

Certo, fazendo isso que vc falou, ele ira abrir um novo jFrame, mantendo o anterior. Postei os códigos para vc ver. Um é o do TelaPrincipal e o outro é do Config. E se vc analizar estou trabalhando com botões test.

Quando inicio o programa, ele automaticamente executa o jFrame TelaPrincipal, e logo acima dele tem uma sequência de menus e em um deles quando clico, da o comando de mostrar o jFrame Config. No jFrame Config, tenho opção de ajustar a resolução do jFrame TelaPrincipal, porém ele não reajusta do jFrame TelaPrincipal já aberto, ele apenas faz o reajuste e apenas quando abrir um novo jFrame TelaPrincipal, ele mostra com as configurações que selecionei. E o que estou tentando descobrir é se há uma maneira de mandar fechar o jFrame TelaPrincipal inicialmente executado pelo jFrame Config, para abrir um novo.

É como se eu tivesse que estabelecer uma relação entre o jFrame TelaPrincipal inicial e jFrame Config quando abrisse o jFrame Config, para que eu mandasse um comando para o jFrame TelaPrincipal para ele se auto fechar.

package utilitarios;

/**
 *
 * @author Leandro
 */
import home.*;
import java.awt.event.*;


public class Config extends javax.swing.JFrame {
   
       TelaPrincipal home = new TelaPrincipal();
   
 /** Creates new form Config */
    public Config() {
        initComponents();
  
        this.setDefaultCloseOperation(1);
        // Para fechar apenas esse jFrame
       
    }

private void initComponents() {
...
}


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

    private void jComboBox_resolutionItemStateChanged(java.awt.event.ItemEvent evt) {                                                      
        String select = jComboBox_resolution.getSelectedItem().toString();
       
        if (select == "Tela cheia")
        {
            
            home.maximizar();

        }
        else if (select == "1024 x 768")
        {
            
            home.resize(1024, 768);
        }
        else if (select == "800 x 600")
        {
            
            
            home.resize(800, 600);
            
        }

    }                                                     

    private void jButton_testActionPerformed(java.awt.event.ActionEvent evt) {    
                                         
new TelaPrincipal().setVisible(false);//algo assim
   
 }                                            

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Config().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton_sair;
    private javax.swing.JButton jButton_test;
    private javax.swing.JComboBox jComboBox_resolution;
    private javax.swing.JLabel jLabel_tela;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JTabbedPane jTabbedPane_tela;
    // End of variables declaration                   

}
E

ao chamar o frame de configuração vc poderia esperar um retorno, ai dependendo deste retorno vc chamaria um metodo que criaria um novo frame (principal) e fecharia o anterios.
Este frame principal poderia ir buscar as informações em um banco, com isso ele seria criado encima das novas configuraçoes que vc teria salvo no frame de configuração…

Anime

Olá LeandroDM,

Desculpe estou sem tempo para analisar seu código,vou deixar um exemplo para vc analisar,qualquer coisa,pode perguntar ok :wink:

import cadastro.*;
import java.util.Date;
import java.text.SimpleDateFormat;
import javax.xml.stream.events.StartDocument;

/**
 *
 * @author  Ana Cláudia
 */
public class Principal extends javax.swing.JFrame {
    data mostra_data;
    /** Creates new form Principal */
    public Principal() {
        initComponents();
        mostra_data=new data();
        mostra_data.le_data();
        label_data.setText (mostra_data.dia_semana  +"("+mostra_data.dia+"/"+mostra_data.mes+"/"+mostra_data.ano+")" );
        
        timer1.start();
        
        
    }
    
   
    private void jPanel1AncestorAdded(javax.swing.event.AncestorEvent evt) {                                      

    }                                     

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

    }                                              

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

    }                                            

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
     new clientes().setVisible(true);
    }                                        

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
     new produto().setVisible(true);
    }                                        

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
     new operadoras().setVisible(true);
    }                                        

    private void menu_saii(java.awt.event.ActionEvent evt) {                           
      System.exit(0);
    }                          

    private void bt_sairActionPerformed(java.awt.event.ActionEvent evt) {                                        
      System.exit(0);
    }                                       

    private void menu_sairMouseClicked(java.awt.event.MouseEvent evt) {                                       
     System.exit(0);
    }                                      

    private void timer1OnTime(java.awt.event.ActionEvent evt) {                              
        mostra_data.le_hora();
        label_hora.setText("Hora atual "+mostra_data.hora);
     
    }                             
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new login().setVisible(true);
            }
        });
    }
import javax.swing.JOptionPane;
import cadastro.*;
import utilitarios.conexao;
   
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/*
 * login.java
 *
 * Created on 14 de Julho de 2010, 15:39
 */

/**
 *
 * @author  Ana Cláudia
 */
public class login extends javax.swing.JFrame {
     int navega=0;
    conexao conecta_login;
    String ordenacao="idusuario";
    int inicia_combo=0;
    int limpa=0;
    /** Creates new form login */
    public login() {
        initComponents();
        conecta_login=new conexao();
        conecta_login.conecta();
    }

       

   
   

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        try
           {
            String sql="SELECT nome FROM TB_acesso  WHERE nome ='"+
                    tf_usuario.getText()+"' and senha  = '"+
                    tf_senha.getText()+"'";
              conecta_login.executaSQL(sql);
              if( conecta_login.resultset.first())
              {
                  JOptionPane.showMessageDialog(null,"Bem Vindo!");
                  new Principal().setVisible(true);
                   dispose();
              } 
              else
              {
                  JOptionPane.showMessageDialog(null,"Dados invalidos.");
              }
              
           }
              catch (Exception ex)
              {
                 JOptionPane.showMessageDialog(null,"ERRO") ;
              }
    }                                        
    
    /**
     * @param args the command line arguments
     */
    
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new login().setVisible(true);
            }
        });
    }
Anime

Oi,

Conseguiu?Fiz um teste aq ,ficou assim:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
     new clientes().setVisible(true);
     dispose();
    }

Fechou a tela principal e abriu clientes e estão em pacotes diferentes…

L

Boa tarde.

elmarquinhos: Eu tentei fazer nesse esquema do retorno, só que estava tentando e não obtive muito sucesso, porque não como fazer para que quando gerar um retorno, o TelaPrincipal detectar automaticamente e executar o dispose(); sem precisar clicar nenhum botão no TelaPrincipal. Resumindo, clico botão aplicar no jFrame Config e ele gera um retorno onde o jFrame TelaPrincipal capta esse retorno automaticamente (como se ele já estivesse esperando-o) e executa automaticamente o comando dispose();

Anime: Então, na verdade não é bem isso. Seu exemplo é maravilhoso, me deu umas boas ideias, se baseando no seu exemplo, sabe o jButton1ActionPerformed, ele realmente funciona fechando o jFrame Principal e iniciando o jFrame Clientes, atendendo minhas necessidades.

Porém, o que na verdade estava tentando fazer, pelo simles motivo de não ter conseguido e querer saber como que faz mesmo, é que vamos supor que estou no jFrame Principal e vou para o jFrame Clientes sem dar o dispose() no jFrame Principal. Agora que estou no jFrame Clientes com o jFrame Principal ainda aberto, quero que um botão do jFrame Clientes de o comando de fechar o jFrame Principal.

O return vi que é uma possibilidade, mas não tenho muita experiencia com o return trabalhando com Swing, porque teria que dar o efeito que disse para o elmarquinhos.

Anime

Entendi…vou pesquisar,se encontrar algo eu posto ok :wink:

L

Certo, obrigado.

^^

ViniGodoy

Segue um exemplo. Ambos os frames são capazes de abrir ou fechar o outro frame.

O segredo está em passar um frame como parâmetro do outro.
Seria fácil também comunicar valores entre eles, bastaria para isso incluir um método de set no frame e chama-lo.

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;

public class FramePrincipal extends JFrame {
    private FrameCadastro frmCadastro;

    public FramePrincipal()
    {
        setSize(640,480);
        setLocationRelativeTo(null);
        setLayout(new BorderLayout());
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowAdapter()
        {
            @Override
            public void windowClosing(WindowEvent e) {
                fechar();
            }

        });
        
        JMenu mnuArquivo = new JMenu("Arquivo");
        JMenuItem mniFechar = new JMenuItem("Fechar");

        mniFechar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt)
            {
                fechar();
            }
        });
        mnuArquivo.add(mniFechar);

        JMenu mnuCadastro = new JMenu("Cadastro");
        JMenuItem mniAbrir = new JMenuItem("Abrir");
        mniAbrir.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt)
            {
                abrirCadastro();
            }
        });
        mnuCadastro.add(mniAbrir);

        JMenuItem mniFecharCadastro = new JMenuItem("Fechar");
        mniFecharCadastro.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt)
            {
                fecharCadastro();
            }
        });
        mnuCadastro.add(mniFecharCadastro);

        JMenuBar mb = new JMenuBar();
        mb.add(mnuArquivo);
        mb.add(mnuCadastro);
        add(mb, BorderLayout.NORTH);
        
        frmCadastro = new FrameCadastro(this);
    }

    private void abrirCadastro()
    {
        frmCadastro.setVisible(true);
    }

    private void fecharCadastro()
    {
        frmCadastro.dispose();
    }

    private void fechar()
    {
        if (JOptionPane.showConfirmDialog(this, "Vai fechar tudo. Continua?", 
                "Confirme o fechamento",
                JOptionPane.YES_NO_OPTION) != JOptionPane.OK_OPTION)
        {
            return;
        }

        //Fecha o sistema inteiro
        System.exit(0);

        /*Se você quisesse fechar só o painel de cadastro, você faria:
        fc.dispose();           
        */
    }
    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run() {
                new FramePrincipal().setVisible(true);
            }
        });
    }
}
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class FrameCadastro extends JFrame {

    private FramePrincipal frmPrincipal;

    public FrameCadastro(FramePrincipal frmPrincipal) {
        setSize(320, 200);
        setLocationRelativeTo(frmPrincipal);
        setLayout(new BorderLayout());
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowAdapter()
        {
            @Override
            public void windowClosing(WindowEvent e) {
                fechar();
            }
        });

        this.frmPrincipal = frmPrincipal;
        JMenu mnuArquivo = new JMenu("Arquivo");
        JMenuItem mniFechar = new JMenuItem("Fechar");
        mniFechar.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent evt) {
                fechar();
            }
        });

        mnuArquivo.add(mniFechar);

        JMenu mnuPrincipal = new JMenu("Principal");

        JMenuItem mniAbrirPrincipal = new JMenuItem("Abrir");
        mniAbrirPrincipal.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent evt) {
                abrirPrincipal();
            }
        });
        mnuPrincipal.add(mniAbrirPrincipal);

        JMenuItem mniFecharPrincipal = new JMenuItem("Fechar");
        mniFecharPrincipal.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent evt) {
                fecharPrincipal();
            }
        });
        mnuPrincipal.add(mniFecharPrincipal);

        JMenuBar mb = new JMenuBar();
        mb.add(mnuArquivo);
        mb.add(mnuPrincipal);
        add(mb, BorderLayout.NORTH);
    }

    private void fechar() {
        dispose();
    }

    private void abrirPrincipal() {
        frmPrincipal.setVisible(true);
    }

    private void fecharPrincipal() {
        frmPrincipal.dispose();
    }
}
Anime

Olá Vini,

Obrigada pelo exemplo… :wink:

L

Ficou perfeito ViniGodoy. Agora vou analisar e implementar no meu TCC.

Muito obrigado a todos, especialmente a vc Anime e ao ViniGodoy com seu exemplo.

Abraços e até +

^^

Anime

Por nada :wink:

Boa sorte!

Criado 28 de setembro de 2010
Ultima resposta 29 de set. de 2010
Respostas 16
Participantes 6