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