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

R

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

A

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…

E

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);
    }
}
A
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…

A

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);
            }
        });
    }
A

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.

A

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

L

Certo, obrigado.

^^

V

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

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é +

^^

A

Por nada :wink:

Boa sorte!

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