Fechar banco de dados quando clicar em fechar na janela

Cordiais saudações, pessoal do GUJ.

Estou com um probleminha no meu menu principal. O JFrame fecha com a opção:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Mas quando estou em um JPanel (dentro do JFrame) e clico no X da janela, o programa não fecha o banco de dados antes de sair. Como resolvo isto?

A linha que fecha os arquivos é BD.getInstance().close() e eu não sei se é possível colocá-la no programa de menu principal.
Atenciosamente,
Ronaldo

Segue abaixo meu programa de menu:

package empresaiv;

import br.com.gui.GuiCadastroCategorias;
import br.com.gui.GuiCadastroClientes;
import br.com.gui.GuiCadastroEndEntCli;
import br.com.gui.GuiCadastroFornecedores;
import br.com.gui.GuiCadastroProdutos;
import br.com.gui.GuiCadastroUnidades;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 *
 * @author Ronaldo R. Godoi
 */
public class GuiMenuPrincipal extends JFrame {
    private Container contentPane;
    private JMenuBar mnBarra;
    private JMenu mnArquivos, mnPedidos, mnConsultas, mnRelatorios;
    private JMenuItem miSair, miClientes, miFornecedores, miProdutos,
            miCategorias, miEndEntregaCliente, miEndEntregaFornecedor,
            miForProduto, miUnidades;
    private JMenuItem miPedidoCliente, miPedidoFornecedor;
    private JMenuItem miRelatorioClientes, miRelatorioFornecedores,
            miRelatorioProdutos, miRelatorioCategorias;
    private JMenuItem miConsultaClientes, miConsultaFornecedor, miConsultaProdutos,
            miConsultaCategorias, miConsultaEndEntregaCli, miConsultaEndEntregaFor;
        
    public GuiMenuPrincipal() {
        inicializarComponentes();
        definirEventos();
    }
    
    public void inicializarComponentes () {
        setTitle("Aplicativo Empresa");
        setBounds(0, 0, 1000, 800);
        contentPane = getContentPane();
        mnBarra = new JMenuBar();
        mnArquivos = new JMenu("Arquivos");
        mnArquivos.setMnemonic('A');
        mnPedidos = new JMenu("Pedidos");
        mnPedidos.setMnemonic('P');
        mnConsultas = new JMenu("Consultas");
        mnConsultas.setMnemonic('C');
        mnRelatorios = new JMenu("Relatórios");
        mnRelatorios.setMnemonic('R');
        
        // Arquivos ou Cadastros
        miClientes = new JMenuItem("Cadastro de Clientes");
        miFornecedores = new JMenuItem("Cadastro de Fornecedores");
        miProdutos = new JMenuItem("Cadastro de Produtos");
        miCategorias = new JMenuItem("Cadastro de Categoria de Produto");
        miEndEntregaCliente = new JMenuItem("Cadastro de Endereço de Entrega de Cliente");
        miEndEntregaFornecedor = new JMenuItem("Cadastro de Endereço de Entrega de Fornecedor");
        miForProduto = new JMenuItem("Cadastro de Fornecedor do Produto");
        miUnidades = new JMenuItem("Cadastro de Unidades de Venda e Compra")
        miSair = new JMenuItem("Sair", new ImageIcon("c:/icones/sair2.jpg"));
        miSair.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.ALT_MASK));
        
        // Pedidos
        miPedidoCliente = new JMenuItem("Pedidos de Clientes");
        miPedidoFornecedor = new JMenuItem("Pedidos para Fornecedor");
        
        // Consultas
        miConsultaClientes = new JMenuItem("Consulta Clientes");
        miConsultaFornecedor = new JMenuItem("Consulta Fornecedor");
        miConsultaProdutos = new JMenuItem("Consulta Produtos");
        miConsultaCategorias = new JMenuItem("Consulta Categorias");
        miConsultaEndEntregaCli = new JMenuItem("Consulta Endereço de Entrega de Cliente");
        miConsultaEndEntregaFor = new JMenuItem("Consulta Endereço de Entrega de Fornecedor");
        
        // Relatórios
        miRelatorioClientes = new JMenuItem("Relatório de Clientes");
        miRelatorioFornecedores = new JMenuItem("Relatório de Fornecedores");
        miRelatorioProdutos = new JMenuItem("Relatório de Produtos");
        miRelatorioCategorias = new JMenuItem("Relatório de Categorias");
                
        //Menu Cadastros
        mnArquivos.add(miClientes);
        mnArquivos.add(miFornecedores);
        mnArquivos.add(miProdutos);
        mnArquivos.add(miCategorias);
        mnArquivos.add(miEndEntregaCliente);
        mnArquivos.add(miEndEntregaFornecedor);
        mnArquivos.add(miForProduto);
        mnArquivos.add(miUnidades);
        mnArquivos.add(miSair);
        
        //Menu Pedidos
        mnPedidos.add(miPedidoCliente);
        mnPedidos.add(miPedidoFornecedor);
        
        //Menu Consultas
        mnConsultas.add(miConsultaClientes);
        mnConsultas.add(miConsultaFornecedor);
        mnConsultas.add(miConsultaProdutos);
        mnConsultas.add(miConsultaCategorias);
        mnConsultas.add(miConsultaEndEntregaCli);
        mnConsultas.add(miConsultaEndEntregaFor);
        
        //Menu Relatórios
        mnRelatorios.add(miRelatorioClientes);
        mnRelatorios.add(miRelatorioFornecedores);
        mnRelatorios.add(miRelatorioProdutos);
        mnRelatorios.add(miRelatorioCategorias);
        
        mnBarra.add(mnArquivos);
        mnBarra.add(mnPedidos);
        mnBarra.add(mnConsultas);
        mnBarra.add(mnRelatorios);
        setJMenuBar(mnBarra);
    }
    
    private void definirEventos() {
        miSair.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                BD.getInstance().close();
                System.exit(0);
            }
        });

        miClientes.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiCadastroClientes label = new GuiCadastroClientes();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });
        
        miFornecedores.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiCadastroFornecedores label = new GuiCadastroFornecedores();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });

        miProdutos.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiCadastroProdutos label = new GuiCadastroProdutos();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });
        
        miCategorias.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiCadastroCategorias label = new GuiCadastroCategorias();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });
        
        miEndEntregaCliente.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiCadastroEndEntCli label = new GuiCadastroEndEntCli();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });
        
        miUnidades.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiCadastroUnidades label = new GuiCadastroUnidades();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });
        
    }
        
    public static void abrir() {
        GuiMenuPrincipal frame = new GuiMenuPrincipal();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Dimension tela = Toolkit.getDefaultToolkit().getScreenSize();
        frame.setLocation((tela.width - frame.getSize().width) / 2,
                (tela.height - frame.getSize().height) / 2);
        frame.setVisible(true);
    }
    
}

Se ao fechar o JPanel e a execução do programa terminar então a conexão fecha junto.

Utilize o frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
Em seguida adicione um WindowListener para tratar o fechamento da aplicação.

Staroski, você pode notar que a configuração do JFrame frame para o GuiMenuPrincipal é JFrame.EXIT_ON_CLOSE, da forma que está definido no método public static void abrir() . Como você pode perceber quando eu entro em uma classe qualquer, por exemplo, uma classe de cadastro e desaventuradamente dou um clique no X (para fechar) da janela saio do programa e o meu medo é causar algum dano aos arquivos que devem estar abertos. Meu medo tem procedência? Se eu voltar ao Windows sem dar o comando para encerrar a conexão pode acontecer algo de errado? Ou o sistema java se encarrega do banco de dados e deixa tudo certinho?

Outra coisa, esse parâmetro frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE) funciona de que forma, ele desabilita o X da janela para que não funcione e não feche o programa? Olhando na internet parece ser este o efeito. Desta forma, tem um jeito de fazer esta configuração quando eu entro em um programa de cadastro, por exemplo, e reativar o JFrame.EXIT_ON_CLOSE quando sair deste programa?

Provavelmente ele deve ser setado dentro do programa de cadastro, estou correto? E para ativar o fechamento da janela deve ser setado JFrame.EXIT_ON_CLOSE, no mesmo lugar onde saio da classe de cadastro, por exemplo, estou correto?

Neste programa que estou trabalhando os menus ficam a disposição do usuário então, durante um cadastro qualquer, o usuário pode simplesmente clicar no menu Arquivo, Pedidos, Consultas, etc. e trocar de programa (classe). Isto não me parece um procedimento muito ortodoxo (correto). Eu gostaria de deixar a barra de menu e suas opções desativadas e só ativá-las quando o usuário clicar no botão sair do cadastro e voltar a tela vazia que é o menu, e aí sim, com as opções disponíveis para ele prosseguir nos trabalhos do sistema. Como eu desativo a barra de menu e como ativo?

Um grande abraço aos colegas do GUJ,
Ronaldo

Por isso que eu disse para você adicionar um WindowListener e tratar o fechamento da janela, no evento windowClosing você vai fazer o close do banco e o System.exit.

Errado, você vai adicionar um WindowListener e tratar o fechamento da janela.

Você já se habituou a ler a documentação das classes que utiliza?
Dê uma lida na documentação das classes Menu, MenuItem e MenuBar.

Staroski, muito obrigado pelo windowListener. Realmente eu não sei onde encontrar a documentação das classes. Tentei várias vezes o help do NetBeans, digitando nome de classe e de método. Não sei se instalei a documentação Java.

Por favor, como posso acessar essa documentação que já tentei e já ouvi falar nela várias vezes?

Tudo que aprendi foi com livros e, não sempre, muitas vezes eles citam a classe e os métodos mas infelizmente não entram em detalhes. Certamente esperam que consultemos essa tal documentação a qual estou ancioso para encontrar. Podendo até, estar sentado sobre ela.

Atenciosamente,
Ronaldo

Uma forma fácil de achar a doc de alguma classe é pesquisar assim no google: javadoc NomeDaClasse. Geralmente aparece como primeiro link no resultado. Mas vc também consegue acessar a documentação através do código da classe pela sua IDE.

1 curtida

https://docs.oracle.com/en/java/javase/11/docs/api/

O link acima é da versão 11, mas é só trocar o número para a versão que você utiliza

1 curtida

Descobri que:

mnArquivos.setEnabled(false);

transforma esse menu em inativo até que seja encontrado um:

mnArquivos.setEnabled(true);

Tive a brilhante idéia de criar um método para desligar todos menus, ao entrar no cadastro e ligar todos menus ao sair dele (tudo isso no GuiMenuPrincipal.java), veja como ficou e, já adianto, não funcionou:

public void bloqueiaMenu() {
    mnArquivos.setEnabled(false);
    mnPedidos.setEnabled(false);
    mnConsultas.setEnabled(false);
    mnRelatorios.setEnabled(false);
}

public void liberaMenu() {
    mnArquivos.setEnabled(true);
    mnPedidos.setEnabled(true);
    mnConsultas.setEnabled(true);
    mnRelatorios.setEnabled(true);
}

Dentro do método definir eventos, no local onde eu entrava no cadastro de clientes fiz a prática de usar meus métodos bloqueiaMenu() e liberaMenu(), e no programa ficou assim:

miClientes.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        bloqueiaMenu();
        GuiCadastroClientes label = new GuiCadastroClientes();
        contentPane.removeAll();
        contentPane.add(label);
        contentPane.validate();
        liberaMenu();
    }
});

Mas não surtiu efeito, porque o liberaMenu() estava cancelando automaticamento o efeito do bloqueiaMenu(), então tirei o liberaMenu() e ficou assim:

    miClientes.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            bloqueiaMenu();
            GuiCadastroClientes label = new GuiCadastroClientes();
            contentPane.removeAll();
            contentPane.add(label);
            contentPane.validate();
        }
    });

De fato os menus Arquivos, Pedidos, Relatórios e Consultas foram desabilitados pelo meu procedimento. Mas não encontrei um lugar onde colocar o procedimento liberaMenu(). É um problema da filosofia de funcionamento do java, pode ter relação com tipo de variável static, public, private. Coisas que eu ainda não entendi muito bem. O que acontece é que quando entro no menu principal tudo funciona, o menu está ativo, daí eu entro em uma opção (cadastro de cliente, por exemplo) e desativo os menus no controle de evento que inicializa a classe GuiCadastroClientes.java. Mas quando saio, através do botão sair do cadastro de cliente, os menus continuam desativados, porque não encontro um lugar para usar o método liberaMenu() que ativa os menus Arquivos, Pedidos, Consultas, Relatórios. Veja que a saída do programa de cadastro de cliente é em outra classe e não sei usar o método liberaMenu() que é da classe GuiMenuPrincipal dentro de GuiCadastroClientes. Ele pede que sejam varíaveis estáticas enquanto o programa de menu rejeita essa possibilidade, então não sei o que fazer.

Pois é pessoal, eu gostaria que alguém me desse uma solução para esse problema de desativação de menu e ativação de menu. Meu programa de menu (GuiMenuPrincipal.java) vocês já tem acima e abaixo da assinatura vou mandar o programa de cadastro de clientes (GuiCadastroClientes.java). Note que as mudanças de acrescentar os métodos bloqueiaMenu() e liberaMenu(), e colocar estratégicamente dentro da chamada miClientes.addActionListener(new ActionListener() {… ainda não foram atualizados no GuiMenuPrincipal que vocês tem das outras mensagens deste tópicos, mas isto não importa muito se você entender o problema.

Atenciosamente, antecipadamente grato,
Ronaldo

Programa de cadastro de clientes:

package br.com.gui;

import bdclientes.CliDAO;
import empresaiv.BD;
import empresaiv.GuiMenuPrincipal;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;


/**
 *
 * @author Ronaldo Rodrigues Godoi
 */
public class GuiCadastroClientes extends JPanel{
    
    JLabel lbCad_cli, lbLargura, lbAltura;
    
    boolean inclusao = false;
    
    JLabel lbId_cgc_cpf, lbFisica_juridica, lbNome_razao, lbEmail, lbTelefone,
           lbCep, lbEndereco, lbNumero, lbComplemento, lbBairro, lbCidade,
           lbEstado, lbData_cadastro;
    

    JButton btGravar, btAlterar, btExcluir, btNovo, btLocalizar, btCancelar, btSair;
    
    JTextField tfId_cgc_cpf, tfFisica_juridica, tfNome_razao, tfEmail, tfTelefone,
            tfCep, tfEndereco, tfNumero, tfComplemento, tfBairro, tfCidade,
            tfEstado, tfData_cadastro;
    
    JComboBox<String> cbFisJur, cbEstado;
    String[] cbFisJurItem = {"1", "2", ""};
    String[] cbEstadoItem = {"AC", "AL", "AP", "AM", "BA", "CE", "ES", "GO",
                             "MA", "MT", "MS", "MG", "PA", "PB", "PR", "PE",
                             "PI", "RJ", "RN", "RS", "RO", "RR", "SC", "SP",
                             "SE", "TO", "DF", ""};
    JScrollPane sp1, sp2;
      
    Date nova_data = new Date();
    DateFormat formatoData = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    
    private CliDAO clientes;
        
    public GuiCadastroClientes() {
        
        inicializarComponentes();
        definirEventos();
        
    }
    
    public void inicializarComponentes() {
        setLayout(null);
        
        Dimension tela = Toolkit.getDefaultToolkit().getScreenSize();
        lbLargura = new JLabel(""+tela.width);
        lbAltura = new JLabel(""+tela.height);
        int altura = 1000;
        int largura = 1800;
        setBounds(0, 0, largura, altura);
        
        lbCad_cli = new JLabel("Cadastro de Clientes");
        
        cbFisJur = new JComboBox(cbFisJurItem);
        cbEstado = new JComboBox(cbEstadoItem);
        sp1 = new JScrollPane(cbFisJur);
        sp2 = new JScrollPane(cbEstado);
        
        lbId_cgc_cpf = new JLabel("CPF ou CGC: ");
        lbFisica_juridica = new JLabel("Pessoa física ou jurídica: ");
        lbNome_razao = new JLabel("Nome ou Razão Social: ");
        lbEmail = new JLabel("Email: ");
        lbTelefone = new JLabel("Telefone: ");
        lbCep = new JLabel("CEP: ");
        lbEndereco = new JLabel("Endereço: ");
        lbNumero = new JLabel("Número:");
        lbComplemento = new JLabel("Complemento: ");
        lbBairro = new JLabel("Bairro: ");
        lbCidade = new JLabel("Cidade: ");
        lbEstado = new JLabel("Estado: ");
        lbData_cadastro = new JLabel("Data de cadastro: ");
        
        tfId_cgc_cpf = new JTextField(20);
        tfFisica_juridica = new JTextField(1);
        tfNome_razao = new JTextField(60);
        tfEmail = new JTextField(80);
        tfTelefone = new JTextField(17); 
        tfCep = new JTextField(9);
        tfEndereco = new JTextField(60);
        tfNumero = new JTextField(10);
        tfComplemento = new JTextField(40);
        tfBairro = new JTextField(60);
        tfCidade = new JTextField(40);
        tfEstado = new JTextField(2);
        tfData_cadastro = new JTextField(16);
        
        btGravar = new JButton(null, new ImageIcon("c:/icones/icon12/gravar.gif"));
        btGravar.setToolTipText("Gravar");
        btAlterar = new JButton(null, new ImageIcon("c:/icones/icon12/alterar.gif"));
        btAlterar.setToolTipText("Alterar");
        btExcluir = new JButton(null, new ImageIcon("c:/icones/icon12/excluir.gif"));
        btExcluir.setToolTipText("Excluir");
        btLocalizar = new JButton(null, new ImageIcon("c:/icones/icon12/localizar.png"));
        btLocalizar.setToolTipText("Localizar");
        btNovo = new JButton(null, new ImageIcon("c:/icones/icon12/novo.gif"));
        btNovo.setToolTipText("Novo");
        btCancelar = new JButton(null, new ImageIcon("c:/icones/icon12/cancelar.gif"));
        btCancelar.setToolTipText("Cancelar");
        btSair = new JButton(null, new ImageIcon("c:/icones/icon12/sair.png"));
        btSair.setToolTipText("Sair");
        
        lbCad_cli.setBounds(35, 75, 150, 25);
        lbId_cgc_cpf.setBounds(35, 175, 100, 25);
        tfId_cgc_cpf.setBounds(115, 175, 150, 25);
        lbFisica_juridica.setBounds(280, 175, 160, 25);
        sp1.setBounds(450, 175, 45, 30);
        lbNome_razao.setBounds(500, 175, 170, 25);
        tfNome_razao.setBounds(660, 175, 270, 25);
        lbEmail.setBounds(35, 250, 100, 25);
        tfEmail.setBounds(120, 250, 300, 25);
        lbTelefone.setBounds(450, 250, 100, 25);
        tfTelefone.setBounds(520, 250, 100, 25);
        lbCep.setBounds(35, 325, 100, 25);
        tfCep.setBounds(75, 325, 100, 25);
        lbEndereco.setBounds(200, 325, 100, 25);
        tfEndereco.setBounds(270, 325, 300, 25);
        lbNumero.setBounds(665, 325, 100, 25);
        tfNumero.setBounds(735, 325, 100, 25);
        lbComplemento.setBounds(35, 400, 150, 25);
        tfComplemento.setBounds(130, 400, 225, 25);
        lbBairro.setBounds(400, 400, 50, 25);
        tfBairro.setBounds(495, 400, 250, 25);
        lbCidade.setBounds(35, 475, 200, 25);
        tfCidade.setBounds(90, 475, 280, 25);
        lbEstado.setBounds(450, 475, 100, 25);
        sp2.setBounds(500, 475, 50, 30);
        lbData_cadastro.setBounds(600, 475, 150, 25);
        tfData_cadastro.setBounds(720, 475, 150, 25);
        
        btNovo.setBounds     (45, 650, 75, 75);
        btLocalizar.setBounds(145, 650, 75, 75);
        btGravar.setBounds   (245, 650, 75, 75);
        btAlterar.setBounds  (345, 650, 75, 75);
        btExcluir.setBounds  (445, 650, 75, 75);
        btCancelar.setBounds (545, 650, 75, 75);
        btSair.setBounds     (645, 650, 75, 75);
        lbLargura.setBounds  (745, 650, 75, 75);
        lbAltura.setBounds   (845, 650, 75, 75);
        
        add(lbCad_cli);
        add(lbLargura);
        add(lbAltura);
        add(lbId_cgc_cpf);
        add(tfId_cgc_cpf);
        add(lbFisica_juridica);
        add(sp1);
        add(lbNome_razao);
        add(tfNome_razao);
        add(lbEmail);
        add(tfEmail);
        add(lbTelefone);
        add(tfTelefone);
        add(lbCep);
        add(tfCep);
        add(lbEndereco);
        add(tfEndereco);
        add(lbNumero);
        add(tfNumero);
        add(lbComplemento);
        add(tfComplemento);
        add(lbBairro);
        add(tfBairro);
        add(lbCidade);
        add(tfCidade);
        add(lbEstado);
        add(sp2);
        add(lbData_cadastro);
        add(tfData_cadastro);
        
        add(btNovo);
        add(btLocalizar);
        add(btGravar);
        add(btAlterar);
        add(btExcluir);
        add(btCancelar);
        add(btSair);
        
        //setResizable(false);
        setBotoes(true, true, false, false, false, false);
        clientes = new CliDAO();
    }
    
    public void definirEventos() {
        
        tfId_cgc_cpf.addFocusListener(new FocusAdapter() {
            public void focusLost(FocusEvent e) {
                if(inclusao == true) {
                    clientes.cliente.setId_cgc_cpf(tfId_cgc_cpf.getText());
                    if(clientes.localizar()) {
                        JOptionPane.showMessageDialog(null, "Cliente já cadastrado!");
                        tfId_cgc_cpf.requestFocus();
                    }
                }
                return;
            }
        });
        
        btSair.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                BD.getInstance().close();
                setVisible(false);
            }
        });
        
        btNovo.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                inclusao = true;
                limparCampos();
                setBotoes(false, false, true, false, false, true);
            }
        });
        
        btCancelar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                inclusao = false;
                limparCampos();
            }
        });
        
        btGravar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                
                if(tfId_cgc_cpf.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "O CPF ou CGC não podem ser vazios!");
                    tfId_cgc_cpf.requestFocus();
                    return;
                } 
                
                if(tfNome_razao.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "O nome ou razão social não podem ser vazios!");
                    tfNome_razao.requestFocus();
                    return;
                }
                
                if(tfCep.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "O CEP não pode ser vazio!");
                    tfCep.requestFocus();
                    return;
                }
                
                if(tfEndereco.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "O Endereço não pode ser vazio!");
                    tfEndereco.requestFocus();
                    return;
                }
                
                if(tfNumero.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "O número não pode ser vazio!");
                    tfNumero.requestFocus();
                    return;
                } else {
                    try {
                        int numero = Integer.parseInt(tfNumero.getText());
                    } catch (Exception erro) {
                        JOptionPane.showMessageDialog(null, "O número não pode contém caracteres invalidos!");
                        tfNumero.requestFocus();
                        return;
                    }
                }
                
                if(tfCidade.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "A cidade não pode ser vazia!");
                    tfCidade.requestFocus();
                    return;
                }
                
                if(tfBairro.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "O bairro não pode ser vazio");
                    tfBairro.requestFocus();
                    return;
                }
                
                if(tfData_cadastro.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "A data de cadastro não pode ser vazia");
                    tfData_cadastro.requestFocus();
                    return;
                }
                
                clientes.cliente.setId_cgc_cpf(tfId_cgc_cpf.getText());
                clientes.cliente.setFisica_juridica(cbFisJur.getSelectedItem()+"");
                clientes.cliente.setNome_razao(tfNome_razao.getText());
                clientes.cliente.setEmail(tfEmail.getText());
                clientes.cliente.setTelefone(tfTelefone.getText());
                clientes.cliente.setCep(tfCep.getText());
                clientes.cliente.setEndereco(tfEndereco.getText());
                clientes.cliente.setNumero(tfNumero.getText());
                clientes.cliente.setComplemento(tfComplemento.getText());
                clientes.cliente.setBairro(tfBairro.getText());
                clientes.cliente.setCidade(tfCidade.getText());
                clientes.cliente.setEstado(cbEstado.getSelectedItem()+"");
                clientes.cliente.setData_cadastro(tfData_cadastro.getText());
                
                JOptionPane.showMessageDialog(null, clientes.atualizar(CliDAO.INCLUSAO));
                limparCampos();
                inclusao = false;
            }
        });
        
        btAlterar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                clientes.cliente.setId_cgc_cpf(tfId_cgc_cpf.getText());
                clientes.cliente.setFisica_juridica(cbFisJur.getSelectedItem()+"");
                clientes.cliente.setNome_razao(tfNome_razao.getText());
                clientes.cliente.setEmail(tfEmail.getText());
                clientes.cliente.setTelefone(tfTelefone.getText());
                clientes.cliente.setCep(tfCep.getText());
                clientes.cliente.setEndereco(tfEndereco.getText());
                clientes.cliente.setNumero(tfNumero.getText());
                clientes.cliente.setComplemento(tfComplemento.getText());
                clientes.cliente.setBairro(tfBairro.getText());
                clientes.cliente.setCidade(tfCidade.getText());
                clientes.cliente.setEstado(cbEstado.getSelectedItem()+"");
                clientes.cliente.setData_cadastro(tfData_cadastro.getText());
                JOptionPane.showMessageDialog(null, clientes.atualizar(CliDAO.ALTERACAO));
                limparCampos();
            }
        });
        
        btExcluir.addActionListener(new ActionListener(){ 
            public void actionPerformed(ActionEvent e) {
                clientes.cliente.setId_cgc_cpf(tfId_cgc_cpf.getText());
                clientes.localizar();
                int n = JOptionPane.showConfirmDialog(null, clientes.cliente.getNome_razao(),
                        " Excluir o cliente? ", JOptionPane.YES_NO_OPTION);
                if(n == JOptionPane.YES_OPTION) {
                    JOptionPane.showMessageDialog(null, clientes.atualizar(CliDAO.EXCLUSAO));
                    limparCampos();
                }
            }
        });
        
        btLocalizar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                atualizarCampos();
            }
        });
        
    }
    
    public void limparCampos() {
        
        tfId_cgc_cpf.setText("");
        cbFisJur.setSelectedIndex(2);
        tfFisica_juridica.setText("");
        tfNome_razao.setText("");
        tfEmail.setText("");
        tfTelefone.setText("");
        tfCep.setText("");
        tfEndereco.setText("");
        tfNumero.setText("");
        tfComplemento.setText("");
        tfBairro.setText("");
        tfCidade.setText("");
        cbEstado.setSelectedIndex(27);
        tfEstado.setText("");
        tfData_cadastro.setText(formatoData.format(nova_data.getTime()));
        
        setBotoes(true, true, false, false, false, false);
    }
    
    public void atualizarCampos() {
        clientes.cliente.setId_cgc_cpf(tfId_cgc_cpf.getText());
        if(clientes.localizar()) {
            if(clientes.cliente.getFisica_juridica().equals("1")) 
                {cbFisJur.setSelectedIndex(0);}
            else
                {cbFisJur.setSelectedIndex(1);}
            tfId_cgc_cpf.setText(clientes.cliente.getId_cgc_cpf());
            tfNome_razao.setText(clientes.cliente.getNome_razao());
            tfEmail.setText(clientes.cliente.getEmail());
            tfTelefone.setText(clientes.cliente.getTelefone());
            tfCep.setText(clientes.cliente.getCep());
            tfEndereco.setText(clientes.cliente.getEndereco());
            tfNumero.setText(clientes.cliente.getNumero());
            tfComplemento.setText(clientes.cliente.getComplemento());
            tfBairro.setText(clientes.cliente.getBairro());
            tfCidade.setText(clientes.cliente.getCidade());
            if(clientes.cliente.getEstado().equals("AC")) { cbEstado.setSelectedIndex(0); }
            else if(clientes.cliente.getEstado().equals("AL")) { cbEstado.setSelectedIndex(1); }
            else if(clientes.cliente.getEstado().equals("AP")) { cbEstado.setSelectedIndex(2); }
            else if(clientes.cliente.getEstado().equals("AM")) { cbEstado.setSelectedIndex(3); }
            else if(clientes.cliente.getEstado().equals("BA")) { cbEstado.setSelectedIndex(4); }
            else if(clientes.cliente.getEstado().equals("CE")) { cbEstado.setSelectedIndex(5); }
            else if(clientes.cliente.getEstado().equals("ES")) { cbEstado.setSelectedIndex(6); }
            else if(clientes.cliente.getEstado().equals("GO")) { cbEstado.setSelectedIndex(7); }
            else if(clientes.cliente.getEstado().equals("MA")) { cbEstado.setSelectedIndex(8); }
            else if(clientes.cliente.getEstado().equals("MT")) { cbEstado.setSelectedIndex(9); }
            else if(clientes.cliente.getEstado().equals("MS")) { cbEstado.setSelectedIndex(10); }
            else if(clientes.cliente.getEstado().equals("MG")) { cbEstado.setSelectedIndex(11); }
            else if(clientes.cliente.getEstado().equals("PA")) { cbEstado.setSelectedIndex(12); }
            else if(clientes.cliente.getEstado().equals("PB")) { cbEstado.setSelectedIndex(13); }
            else if(clientes.cliente.getEstado().equals("PR")) { cbEstado.setSelectedIndex(14); }
            else if(clientes.cliente.getEstado().equals("PE")) { cbEstado.setSelectedIndex(15); }
            else if(clientes.cliente.getEstado().equals("PI")) { cbEstado.setSelectedIndex(16); }
            else if(clientes.cliente.getEstado().equals("RJ")) { cbEstado.setSelectedIndex(17); }
            else if(clientes.cliente.getEstado().equals("RN")) { cbEstado.setSelectedIndex(18); }
            else if(clientes.cliente.getEstado().equals("RS")) { cbEstado.setSelectedIndex(19); }
            else if(clientes.cliente.getEstado().equals("RO")) { cbEstado.setSelectedIndex(20); }
            else if(clientes.cliente.getEstado().equals("RR")) { cbEstado.setSelectedIndex(21); }
            else if(clientes.cliente.getEstado().equals("SC")) { cbEstado.setSelectedIndex(22); }
            else if(clientes.cliente.getEstado().equals("SP")) { cbEstado.setSelectedIndex(23); }
            else if(clientes.cliente.getEstado().equals("SE")) { cbEstado.setSelectedIndex(24); }
            else if(clientes.cliente.getEstado().equals("TO")) { cbEstado.setSelectedIndex(25); }
            else if(clientes.cliente.getEstado().equals("DF")) { cbEstado.setSelectedIndex(26); }
            else if(clientes.cliente.getEstado().equals("")) { cbEstado.setSelectedIndex(27); }
            tfData_cadastro.setText(clientes.cliente.getData_cadastro());
            setBotoes(true, true, false, true, true, true);
        } else {
            JOptionPane.showMessageDialog(null, "Cliente não encontrado! " + clientes.cliente.getId_cgc_cpf());
            limparCampos();
        }
    }
    
    public void setBotoes(boolean bNovo, boolean bLocalizar, boolean bGravar,
            boolean bAlterar, boolean bExcluir, boolean bCancelar) {
        btNovo.setEnabled(bNovo);
        btLocalizar.setEnabled(bLocalizar);
        btGravar.setEnabled(bGravar);
        btAlterar.setEnabled(bAlterar);
        btExcluir.setEnabled(bExcluir);
        btCancelar.setEnabled(bCancelar);
    }
    
}

/*
id_cgc_cpf varchar(16) PK 
fisica_juridica varchar(1) 
nome_razao varchar(60) 
email varchar(80) 
telefone varchar(20) 
cep varchar(9) 
endereco varchar(60) 
numero int 
complemento varchar(40) 
bairro varchar(60) 
cidade varchar(40) 
estado varchar(2) 
data_cadastro datetime
*/

Pessoal, consegui desativar o menu. Mas não sei se fiz isto de forma elegante. O NetBeans avisava que os objetos menu mnArquivos, mnPedidos, mnConsultas, mnRelatórios e o método liberaMenu() não eram estáticos e por isto não poderiam ser usados daquela forma.

A forma como eu usava era: a cada programa que eu entrava pelo menu principal, eu desligava o menu (pelo menu principal); e a cada programa que eu saia e voltava para o menu principal eu ligava dentro do programa (que eu estava) o menu.

Mas para usar desta forma tanto os objetos menu quanto o método liberaMenu() tem que ser estáticos e foi o que eu fiz, transformeios em static e o programa rodou.

Entretanto parece algo meio de português, porque tenho que desligar o menu toda vez que chamo uma classe diferente (através de evento de acionamento de item de menu dentro do menu principal) e tenho que ligar o menu no local onde faço a saída da classe para o menu principal. Note que toda chamada a programa tem que desligar menu e toda saída de programa tem que ligar o menu. Tem um jeito mais correto de se fazer isto?

Outra coisa, o método bloqueia menu não precisa ser estático pois é usado dentro do menu principal (GuiMenuPrincipal.java) e o método liberaMenu e os objetos de menu (mnArquivos, mnPedidos, mnRelatórios e mnConsultas) tem que ser estáticos pois são mencionados em outras classes. Isto funciona, mas é elegante?

Qual a melhor forma?
Atenciosamente,
Ronaldo

Ele estava dizendo isso porque você digitou o nome da classe seguido do nome do atributo, que é exatamente a sintaxe para acessar membros estáticos.

Está errado, os componentes da interface de usuário não devem ser estáticos.

Acredito que você ainda não compreendeu a diferença entre classe e objeto.

Pelas dúvidas e problemas que você vem enfrentando no desenvolvimento desse sistema de cadastros, percebe-se que está desenvolvendo na tentativa e erro e inventando funcionalidades à medida que vai avançando.

O certo seria você ter escrito todas essas funcionalidades antes, de forma a conseguir modelar suas classes, seus relacionamentos e visualizar como será a troca de mensagens entre os objetos.

Você está enchendo suas classes de interface de usuário com lógicas que costumam ficar centralizadas em classes controladoras.

É muito difícil ir “fazendo puxadinhos” que não foram projetados antes, seu código vai virar uma maçaroca que nem você vai entender.

Aliás, receio que já está assim, pois você está alterando atributos não estáticos para estáticos sem saber o porquê.

Afinal, você está chamando vários programas ou várias telas de um mesmo programa?
Quantas classes com método main você está executando?

Staroski, o sistema tem apenas um método main, que fica na tela de login, a partir deste login (uma pequena tela de inicio onde ele me pede login e senha) ele abre com o método estático abrir() do GuiMenuPrincipal o próprio menu principal em um novo JFrame. Neste sisteminha tem apenas dois JFrames o resto é JPanel (por enquanto).

Veja a tela de login, chamei esta classe de empresaiv.java, pois já haviam três versões anteriores:

Esta pequena tela é resultado de uma classe de tamanho igualmente pequeno, e esta classe é a única que tem um método main(). Além desta classe temos a classe GuiMenuPrincipal.java que chama as outras classes mas não tem método main(), da mesma forma que as demais classes. Mas a classe GuiMenuPrincipal também é um JFrame igual a empresaiv. Veja uma imagem da GuiMenuPrincipal, abaixo:

Você pode notar que tem 8 itens no menu Arquivos, alguns desses vão mudar com o tempo mas já foram implementados com classes (que eu também chamo de programas) seis itens deste menu. Falta concertar alguns detalhes, e é tudo para aprender, desenvolver, não é muito profissional. Por isto que quero melhorar cada classe. Quem sabe não fico com um gerenciador de clientes, fornecedores, produtos (estoque), contas a pagar e receber que seja mais profissional no fim das contas

Aprendi bastante com esta colcha de retalhos.

Enfim, Staroski, qualquer coisa que você queira saber ou analisar sobre o código que estou costurando, pode perguntar. Lembra: tem apenas um main() no login, tem dois JFrames, e o resto é JPanel. Abaixo vai código de algumas aberturas de programa: primeiro o empresaiv.java.

package empresaiv;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 *
 * @author Ronaldo R. Godoi
 */
public class EmpresaIV extends JFrame {
    
    private JTextField tfLogin;
    private JLabel lbSenha;
    private JLabel lbLogin;
    private JButton btLogar;
    private JButton btCancelar;
    private JPasswordField pfSenha;
    private static EmpresaIV frame;

    public EmpresaIV() {
        
        inicializarComponentes();
        definirEventos();
        
    }
    
    private void inicializarComponentes() {
        
        setTitle("Login no Sistema");
        setBounds(0, 0, 400, 200);
        setLayout(null);
        tfLogin = new JTextField(5);
        pfSenha = new JPasswordField(5);
        lbSenha = new JLabel("Senha: ");
        lbLogin = new JLabel("Login: ");
        btLogar = new JButton("Logar");
        btCancelar = new JButton("Cancelar");
        tfLogin.setBounds(100, 30, 120, 25);
        lbLogin.setBounds(30, 30, 80, 25);
        lbSenha.setBounds(30, 75, 80, 25);
        pfSenha.setBounds(100, 75, 120, 25);
        btLogar.setBounds(20, 120, 100, 25);
        btCancelar.setBounds(125, 120, 100, 25);
        add(tfLogin);
        add(lbSenha);
        add(lbLogin);
        add(btLogar);
        add(btCancelar);
        add(pfSenha);
        
    }
    
    public void definirEventos() {
        
        btLogar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String senha = String.valueOf(pfSenha.getPassword());
                if(tfLogin.getText().equals("java") && senha.equals("java")) {
                    frame.setVisible(false);
                    GuiMenuPrincipal.abrir(); // Aqui vai o código para chamar o exemplo 8.3
                } else {
                    JOptionPane.showMessageDialog(null, "Login ou senha incorretos!");
                }
            }
        });
        
        btCancelar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        
    }
    
    public static void main(String[] args) {
        
        SwingUtilities.invokeLater(new Runnable() { 
            public void run() {
                frame = new EmpresaIV();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                Dimension tela = Toolkit.getDefaultToolkit().getScreenSize();
                frame.setLocation((tela.width - frame.getSize().width) / 2,
                        (tela.height - frame.getSize().height) / 2);
                frame.setVisible(true);
            }
        });
        
    }
    
}

Este acima é o programa de abertura. Não existe arquivo de usuários e senhas, o login é java e a senha é java.

Abaixo vou colocar o GuiMenuPrincipal.java, da forma como está agora:

package empresaiv;

import br.com.gui.GuiCadastroCategorias;
import br.com.gui.GuiCadastroClientes;
import br.com.gui.GuiCadastroEndEntCli;
import br.com.gui.GuiCadastroFornecedores;
import br.com.gui.GuiCadastroProdutos;
import br.com.gui.GuiCadastroUnidades;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 *
 * @author Ronaldo R. Godoi
 */
public class GuiMenuPrincipal extends JFrame {
    private Container contentPane;
    private JMenuBar mnBarra;
    public static JMenu mnArquivos, mnPedidos, mnConsultas, mnRelatorios;
    private JMenuItem miSair, miClientes, miFornecedores, miProdutos,
            miCategorias, miEndEntregaCliente, miEndEntregaFornecedor,
            miForProduto, miUnidades;
    private JMenuItem miPedidoCliente, miPedidoFornecedor;
    private JMenuItem miRelatorioClientes, miRelatorioFornecedores,
            miRelatorioProdutos, miRelatorioCategorias;
    private JMenuItem miConsultaClientes, miConsultaFornecedor, miConsultaProdutos,
            miConsultaCategorias, miConsultaEndEntregaCli, miConsultaEndEntregaFor;
        
    public GuiMenuPrincipal() {
        inicializarComponentes();
        definirEventos();
    }
    
    public void inicializarComponentes () {
        setTitle("Aplicativo Empresa");
        setBounds(0, 0, 1000, 800);
        contentPane = getContentPane();
        mnBarra = new JMenuBar();
        mnArquivos = new JMenu("Arquivos");
        mnArquivos.setMnemonic('A');
        mnPedidos = new JMenu("Pedidos");
        mnPedidos.setMnemonic('P');
        mnConsultas = new JMenu("Consultas");
        mnConsultas.setMnemonic('C');
        mnRelatorios = new JMenu("Relatórios");
        mnRelatorios.setMnemonic('R');
        
        // Arquivos ou Cadastros
        miClientes = new JMenuItem("Cadastro de Clientes");
        miFornecedores = new JMenuItem("Cadastro de Fornecedores");
        miProdutos = new JMenuItem("Cadastro de Produtos");
        miCategorias = new JMenuItem("Cadastro de Categoria de Produto");
        miEndEntregaCliente = new JMenuItem("Cadastro de Endereço de Entrega de Cliente");
        miEndEntregaFornecedor = new JMenuItem("Cadastro de Endereço de Entrega de Fornecedor");
        miForProduto = new JMenuItem("Cadastro de Fornecedor de Produtos");
        miUnidades = new JMenuItem("Cadastro de Unidades de Venda e Compra")
        miSair = new JMenuItem("Sair", new ImageIcon("c:/icones/sair2.jpg"));
        miSair.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.ALT_MASK));
        
        // Pedidos
        miPedidoCliente = new JMenuItem("Pedidos de Clientes");
        miPedidoFornecedor = new JMenuItem("Pedidos para Fornecedor");
        
        // Consultas
        miConsultaClientes = new JMenuItem("Consulta Clientes");
        miConsultaFornecedor = new JMenuItem("Consulta Fornecedor");
        miConsultaProdutos = new JMenuItem("Consulta Produtos");
        miConsultaCategorias = new JMenuItem("Consulta Categorias");
        miConsultaEndEntregaCli = new JMenuItem("Consulta Endereço de Entrega de Cliente");
        miConsultaEndEntregaFor = new JMenuItem("Consulta Endereço de Entrega de Fornecedor");
        
        // Relatórios
        miRelatorioClientes = new JMenuItem("Relatório de Clientes");
        miRelatorioFornecedores = new JMenuItem("Relatório de Fornecedores");
        miRelatorioProdutos = new JMenuItem("Relatório de Produtos");
        miRelatorioCategorias = new JMenuItem("Relatório de Categorias");
                
        //Menu Cadastros
        mnArquivos.add(miClientes);
        mnArquivos.add(miFornecedores);
        mnArquivos.add(miProdutos);
        mnArquivos.add(miCategorias);
        mnArquivos.add(miEndEntregaCliente);
        mnArquivos.add(miEndEntregaFornecedor);
        mnArquivos.add(miForProduto);
        mnArquivos.add(miUnidades);
        mnArquivos.add(miSair);
        
        //Menu Pedidos
        mnPedidos.add(miPedidoCliente);
        mnPedidos.add(miPedidoFornecedor);
        
        //Menu Consultas
        mnConsultas.add(miConsultaClientes);
        mnConsultas.add(miConsultaFornecedor);
        mnConsultas.add(miConsultaProdutos);
        mnConsultas.add(miConsultaCategorias);
        mnConsultas.add(miConsultaEndEntregaCli);
        mnConsultas.add(miConsultaEndEntregaFor);
        
        //Menu Relatórios
        mnRelatorios.add(miRelatorioClientes);
        mnRelatorios.add(miRelatorioFornecedores);
        mnRelatorios.add(miRelatorioProdutos);
        mnRelatorios.add(miRelatorioCategorias);
        
        mnBarra.add(mnArquivos);
        mnBarra.add(mnPedidos);
        mnBarra.add(mnConsultas);
        mnBarra.add(mnRelatorios);
        setJMenuBar(mnBarra);
        liberaMenu();
    }
    
    private void definirEventos() {
        
        miSair.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                BD.getInstance().close();
                System.exit(0);
            }
        });

        miClientes.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                bloqueiaMenu();
                GuiCadastroClientes label = new GuiCadastroClientes();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });
        
        miFornecedores.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                bloqueiaMenu();
                GuiCadastroFornecedores label = new GuiCadastroFornecedores();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });

        miProdutos.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                bloqueiaMenu();
                GuiCadastroProdutos label = new GuiCadastroProdutos();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });
        
        miCategorias.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                bloqueiaMenu();
                GuiCadastroCategorias label = new GuiCadastroCategorias();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });
        
        miEndEntregaCliente.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                bloqueiaMenu();
                GuiCadastroEndEntCli label = new GuiCadastroEndEntCli();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });
        
        miUnidades.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                bloqueiaMenu();
                GuiCadastroUnidades label = new GuiCadastroUnidades();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });
        
    }
    
    public void bloqueiaMenu() {
        mnArquivos.setEnabled(false);
        mnPedidos.setEnabled(false);
        mnConsultas.setEnabled(false);
        mnRelatorios.setEnabled(false);
    }
    
    public static void liberaMenu() {
        mnArquivos.setEnabled(true);
        mnPedidos.setEnabled(true);
        mnConsultas.setEnabled(true);
        mnRelatorios.setEnabled(true);
    }
        
    public static void abrir() {
        GuiMenuPrincipal frame = new GuiMenuPrincipal();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Dimension tela = Toolkit.getDefaultToolkit().getScreenSize();
        frame.setLocation((tela.width - frame.getSize().width) / 2,
                (tela.height - frame.getSize().height) / 2);
        frame.setVisible(true);
    }
    
}

Foi neste programa de menu, acima, que usei pela primeira vez um método static. Pela sua resposta Staroski, entendo que não seja necessário, mas não sei fazer a chamada para ativar os menus de outra forma.

Em uma mensagem anexo, vou enviar o código do meu programa mais difícil de cadastro até agora, que é o cadastro de produtos, porque ele tem vínculo com um cadastro de categorias de produto e com um cadastro de unidades de produto. Mas, quando estiver lendo os programas, lembre-se é acadêmico. Uma das coisas mais legais que tem no sistema é a forma como você ensinou a usar instance para verificar se a conexão já estava aberta (aquilo é muito legal). Veja na próxima mensagem deste tópico o código da classe que cadastra produtos, GuiCadastroProdutos.java, não coube nesta porque o site impede arquivos muito grandes.

Isto é tudo que sei sobre programação em Java.
Gostaria muito que alguém do GUJ desse uma lidinha nos códigos destes três programas (é assim que eu chamo as classes) e me recomendasse as devidas correções.

Agora deixa eu fazer uma pergunta: se não preciso usar um método estático com objetos estáticos para acionar os menus através da chamada: GuiMenuPrincipal.liberaMenu();. Então como devo fazer a chamada ao método liberaMenu() que ativa os menu, e este método não deve ser público ou estático? Deve ser o que então?

Fiquem bem a vontade para sugerir qualquer modificação, peço apenas que sejam um pouco detalhista e se for possível mande a sintaxe.

Até logo,
Ronaldo

Este é o programa que eu prometi, GuiCadastroProdutos.java, faz parte da mensagem anterior. Pessoal pode dar dicas para melhorar o programa.

Atenciosamente,
Ronaldo

package br.com.gui;

import bdcategorias.CatDAO;
import bdprodutos.ProDAO;
import bdunidades.UnidadesDAO;
import empresaiv.BD;
import empresaiv.GuiMenuPrincipal;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;


/**
 *
 * @author Ronaldo Rodrigues Godoi
 */
public class GuiCadastroProdutos extends JPanel{
    
    JLabel lbCad_pro, lbLargura, lbAltura;
    
    boolean inclusao = false;
    
    JLabel lbId, lbDescricao, lbCategoria, lbQuantidade, lbUnidade,
           lbPreco_venda, lbPreco_ultima_compra, lbData_cadastro;
    
    JLabel lbDescricao_categoria, lbDescricao_unidade;
    
    JButton btGravar, btAlterar, btExcluir, btNovo, btLocalizar, btCancelar, btSair;
    
    JTextField tfId, tfDescricao, tfCategoria, tfQuantidade, tfUnidade,
           tfPreco_venda, tfPreco_ultima_compra, tfData_cadastro;
    
    Date nova_data = new Date();
    DateFormat formatoData = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    
    private ProDAO produtos;
    private CatDAO categorias;
    private UnidadesDAO unidades;
        
    public GuiCadastroProdutos() {
        
        inicializarComponentes();
        definirEventos();
        
    }
    
    public void inicializarComponentes() {
        setLayout(null);
        //setTitle("Cadastro de Filmes");
        //setBounds(200, 100, 650, 120);
        
        Dimension tela = Toolkit.getDefaultToolkit().getScreenSize();
        lbLargura = new JLabel(""+tela.width);
        lbAltura = new JLabel(""+tela.height);
        int altura = 1000;
        int largura = 1800;
                
        lbCad_pro = new JLabel("Cadastro de Produtos");
        
        lbId = new JLabel("Código do Produto: ");
        lbDescricao = new JLabel("Descrição: ");
        lbCategoria = new JLabel("Categoria: ");
        lbDescricao_categoria = new JLabel("Descrição da Categoria: ");
        lbQuantidade = new JLabel("Quantidade em Estoque: ");
        lbUnidade = new JLabel("Unidade: ");
        lbDescricao_unidade = new JLabel("Unidade: ")
        lbPreco_venda = new JLabel("Preço de Venda: ");
        lbPreco_ultima_compra = new JLabel("Preço da última compra: ");
        lbData_cadastro = new JLabel("Data de Cadastro: ");
                
        tfId = new JTextField(10);
        tfDescricao = new JTextField(60);
        tfCategoria = new JTextField(10);
        tfQuantidade = new JTextField(10);
        tfUnidade = new JTextField(10); 
        tfPreco_venda = new JTextField(10);
        tfPreco_ultima_compra = new JTextField(10);
        tfData_cadastro = new JTextField(16);
        
        //tfData_cadastro.setText(formatoData.format(nova_data.getTime()));
        
        btGravar = new JButton(null, new ImageIcon("c:/icones/icon12/gravar.gif"));
        btGravar.setToolTipText("Gravar");
        btAlterar = new JButton(null, new ImageIcon("c:/icones/icon12/alterar.gif"));
        btAlterar.setToolTipText("Alterar");
        btExcluir = new JButton(null, new ImageIcon("c:/icones/icon12/excluir.gif"));
        btExcluir.setToolTipText("Excluir");
        btLocalizar = new JButton(null, new ImageIcon("c:/icones/icon12/localizar.png"));
        btLocalizar.setToolTipText("Localizar");
        btNovo = new JButton(null, new ImageIcon("c:/icones/icon12/novo.gif"));
        btNovo.setToolTipText("Novo");
        btCancelar = new JButton(null, new ImageIcon("c:/icones/icon12/cancelar.gif"));
        btCancelar.setToolTipText("Cancelar");
        btSair = new JButton(null, new ImageIcon("c:/icones/icon12/sair.png"));
        btSair.setToolTipText("Sair");
        
        
        lbCad_pro.setBounds(35, 75, 150, 25);
        
        lbId.setBounds(35, 175, 150, 25);
        tfId.setBounds(200, 175, 150, 25);
        lbDescricao.setBounds(500, 175, 170, 25);
        tfDescricao.setBounds(600, 175, 270, 25);
        lbCategoria.setBounds(35, 250, 100, 25);
        tfCategoria.setBounds(120, 250, 80, 25);
        lbDescricao_categoria.setBounds(35, 275, 300, 25);
        lbQuantidade.setBounds(480, 250, 200, 25);
        tfQuantidade.setBounds(700, 250, 100, 25);
        lbUnidade.setBounds(35, 325, 100, 25);
        tfUnidade.setBounds(105, 325, 100, 25);
        lbDescricao_unidade.setBounds(35, 350, 400, 25);
        lbPreco_venda.setBounds(400, 325, 150, 25);
        tfPreco_venda.setBounds(520, 325, 150, 25);
        lbPreco_ultima_compra.setBounds(35, 400, 250, 25);
        tfPreco_ultima_compra.setBounds(245, 400, 150, 25);
        lbData_cadastro.setBounds(435, 400, 150, 25);
        tfData_cadastro.setBounds(600, 400, 225, 25);
        
        btNovo.setBounds     (45, 550, 75, 75);
        btLocalizar.setBounds(145, 550, 75, 75);
        btGravar.setBounds   (245, 550, 75, 75);
        btAlterar.setBounds  (345, 550, 75, 75);
        btExcluir.setBounds  (445, 550, 75, 75);
        btCancelar.setBounds (545, 550, 75, 75);
        btSair.setBounds     (645, 550, 75, 75);
        lbLargura.setBounds  (745, 550, 75, 75);
        lbAltura.setBounds   (845, 550, 75, 75);
                
        add(lbCad_pro);
        
        add(lbId);
        add(tfId);
        add(lbDescricao);
        add(tfDescricao);
        add(lbCategoria);
        add(tfCategoria);
        add(lbDescricao_categoria);
        add(lbQuantidade);
        add(tfQuantidade);
        add(lbUnidade);
        add(tfUnidade); 
        add(lbDescricao_unidade);
        add(lbPreco_venda);
        add(tfPreco_venda);
        add(lbPreco_ultima_compra);
        add(tfPreco_ultima_compra);
        add(lbData_cadastro);
        add(tfData_cadastro);
        
        add(lbLargura);
        add(lbAltura);
        
        add(btNovo);
        add(btLocalizar);
        add(btGravar);
        add(btAlterar);
        add(btExcluir);
        add(btCancelar);
        add(btSair);

        setBotoes(true, true, false, false, false, false);
        produtos = new ProDAO();
        categorias = new CatDAO();
        unidades = new UnidadesDAO();
    }
    
    public void definirEventos() {
        
        tfId.addFocusListener(new FocusAdapter() {
            public void focusLost(FocusEvent e) {
                if(inclusao == true) {
                    produtos.produto.setId(tfId.getText());
                    if(produtos.localizar()) {
                        JOptionPane.showMessageDialog(null, "Produto já cadastrado!");
                        tfId.requestFocus();
                    }
                }
                return;
            }
        });
            
        tfCategoria.addFocusListener(new FocusAdapter() {
            public void focusLost(FocusEvent e) {
                categorias.categoria.setId(tfCategoria.getText());
                if(!categorias.localizar()) {
                    JOptionPane.showMessageDialog(null, "Categoria não cadastrada!");
                    tfCategoria.requestFocus();
                } else {
                    lbDescricao_categoria.setText("Descrição da Categoria: " + 
                            categorias.categoria.getDescricao());
                    tfQuantidade.requestFocus();
                }
                return;
            }
        });
        
        tfUnidade.addFocusListener(new FocusAdapter() {
            public void focusLost(FocusEvent e) {
                unidades.unidade.setId(tfUnidade.getText());
                if(!unidades.localizar()) {
                    JOptionPane.showMessageDialog(null, "Unidade não cadastrada!");
                    tfUnidade.requestFocus();
                } else {
                    lbDescricao_unidade.setText("Unidade: " + 
                            unidades.unidade.getDescricao());
                    tfPreco_venda.requestFocus();
                }
                return;
            }
        });
        
        btSair.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiMenuPrincipal.liberaMenu();
                BD.getInstance().close();
                setVisible(false);
            }
        });
        
        btNovo.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                inclusao = true;
                limparCampos();
                setBotoes(false, false, true, false, false, true);
            }
        });
        
        btCancelar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                inclusao = false;
                limparCampos();
            }
        });
        
        btGravar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                
                if(tfId.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "Código do produto não pode ser vazio!");
                    tfId.requestFocus();
                    return;
                } 
                
                if(tfDescricao.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "Descrição do Produto não pode ser vazia!");
                    tfDescricao.requestFocus();
                    return;
                }
                
                if(tfCategoria.equals("")) {
                    JOptionPane.showMessageDialog(null, "Categoria do produto não pode ser vazia!");
                    tfCategoria.requestFocus();
                    return;
                }
                
                try {
                    double numero = Double.parseDouble(tfQuantidade.getText());
                } catch (Exception erro) {
                    JOptionPane.showMessageDialog(null, "A quantidade contém caracteres invalidos!");
                    tfQuantidade.requestFocus();
                    return;
                }
                
                if(tfUnidade.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "A unidade não pode estar vazia!");
                    tfUnidade.requestFocus();
                    return;
                }
                
                try {
                    double numero = Double.parseDouble(tfPreco_venda.getText());
                } catch (Exception erro) {
                    JOptionPane.showMessageDialog(null, "O preço contém caracteres invalidos!");
                    tfQuantidade.requestFocus();
                    return;
                }
                
                try {
                    double numero = Double.parseDouble(tfPreco_ultima_compra.getText());
                } catch (Exception erro) {
                    JOptionPane.showMessageDialog(null, "O preço da ultima compra contém caracteres invalidos!");
                    tfQuantidade.requestFocus();
                    return;
                }
                
                if(tfData_cadastro.getText().equals("")) {
                    JOptionPane.showMessageDialog(null, "A data de cadastro não pode ser vazia");
                    tfData_cadastro.requestFocus();
                    return;
                }
                
                produtos.produto.setId(tfId.getText());
                produtos.produto.setDescricao(tfDescricao.getText());
                produtos.produto.setCategoria(tfCategoria.getText());
                produtos.produto.setQuantidade(Double.parseDouble(tfQuantidade.getText()));
                produtos.produto.setUnidade(tfUnidade.getText());
                produtos.produto.setPreco_venda(Double.parseDouble(tfPreco_venda.getText()));
                produtos.produto.setPreco_ultima_compra(Double.parseDouble(tfPreco_ultima_compra.getText()));
                produtos.produto.setData_cadastro(tfData_cadastro.getText());
                
                JOptionPane.showMessageDialog(null, produtos.atualizar(ProDAO.INCLUSAO));
                limparCampos();
                inclusao = false;
            }
        });
        
        btAlterar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                produtos.produto.setId(tfId.getText());
                produtos.produto.setDescricao(tfDescricao.getText());
                produtos.produto.setCategoria(tfCategoria.getText());
                produtos.produto.setQuantidade(Double.parseDouble(tfQuantidade.getText()));
                produtos.produto.setUnidade(tfUnidade.getText());
                produtos.produto.setPreco_venda(Double.parseDouble(tfPreco_venda.getText()));
                produtos.produto.setPreco_ultima_compra(Double.parseDouble(tfPreco_ultima_compra.getText()));
                produtos.produto.setData_cadastro(tfData_cadastro.getText());
                JOptionPane.showMessageDialog(null, produtos.atualizar(ProDAO.ALTERACAO));
                limparCampos();
            }
        });
        
        btExcluir.addActionListener(new ActionListener(){ 
            public void actionPerformed(ActionEvent e) {
                produtos.produto.setId(tfId.getText());
                produtos.localizar();
                int n = JOptionPane.showConfirmDialog(null, produtos.produto.getDescricao(),
                        " Excluir o produto? ", JOptionPane.YES_NO_OPTION);
                if(n == JOptionPane.YES_OPTION) {
                    JOptionPane.showMessageDialog(null, produtos.atualizar(ProDAO.EXCLUSAO));
                    limparCampos();
                }
            }
        });
        
        btLocalizar.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                atualizarCampos();
            }
        });
        
    }
    
    public void limparCampos() {
        
        tfId.setText("");
        tfDescricao.setText("");
        tfCategoria.setText("");
        lbDescricao_categoria.setText("Descrição da Categoria: ");
        tfQuantidade.setText("");
        tfUnidade.setText("");
        lbDescricao_unidade.setText("Unidade: ");
        tfPreco_venda.setText("");
        tfPreco_ultima_compra.setText("");
        tfData_cadastro.setText(formatoData.format(nova_data.getTime()));
        setBotoes(true, true, false, false, false, false);
    }
    
    public void atualizarCampos() {
        produtos.produto.setId(tfId.getText());
        if(produtos.localizar()) {
            categorias.categoria.setId(produtos.produto.getCategoria());
            if(categorias.localizar()) {
                    lbDescricao_categoria.setText("Descrição da Categoria: " + 
                            categorias.categoria.getDescricao());
            } else {
                    lbDescricao_categoria.setText("Descrição da Categoria: Não cadastrada");
            }
            tfId.setText(produtos.produto.getId());
            tfDescricao.setText(produtos.produto.getDescricao());
            tfCategoria.setText(produtos.produto.getCategoria());
            tfQuantidade.setText(produtos.produto.getQuantidade().toString());
            tfUnidade.setText(produtos.produto.getUnidade());
            unidades.unidade.setId(tfUnidade.getText());
            if(unidades.localizar()) {
                    lbDescricao_unidade.setText("Unidade: " + 
                            unidades.unidade.getDescricao());
            } else {
                    lbDescricao_unidade.setText("Unidade: Não cadastrada");
            }
            tfPreco_venda.setText(produtos.produto.getPreco_venda().toString());
            tfPreco_ultima_compra.setText(produtos.produto.getPreco_ultima_compra().toString());
            tfData_cadastro.setText(produtos.produto.getData_cadastro());
            setBotoes(true, true, false, true, true, true);
        } else {
            JOptionPane.showMessageDialog(null, "Produto não encontrado! " + produtos.produto.getId());
            limparCampos();
        }
    }
    
    public void setBotoes(boolean bNovo, boolean bLocalizar, boolean bGravar,
            boolean bAlterar, boolean bExcluir, boolean bCancelar) {
        btNovo.setEnabled(bNovo);
        btLocalizar.setEnabled(bLocalizar);
        btGravar.setEnabled(bGravar);
        btAlterar.setEnabled(bAlterar);
        btExcluir.setEnabled(bExcluir);
        btCancelar.setEnabled(bCancelar);
    }
    
}

/*
Table: produtos
Columns:
id varchar(10) PK 
descricao varchar(60) 
categoria varchar(10) 
quantidade double 
unidade varchar(10) 
preco_venda double 
preco_ultima_compra double 
data_cadastro datetime
*/

Por mais que seja interessante fazer um código na unha, o uso de uma IDE ajuda muito.
Se me permite uma sugestão, até para facilitar e ampliar seu conhecimento em programação, segue dois link’s de cursos disponibilizados no YouTube, onde é explicado a criação de interfaces através da IDE Netbeans, organização e a codificação em arquivos separados para os tratamentos dos dados.

Projeto Java SE - Learn Java Brazil - Sistema de Atendimento de Clínica

Curso Java para Iniciantes - BLSoft Simplesmente Java - Sistema de Vendas

1 curtida

Então você tem apenas um programa. Ótimo.

Não chame essas classes de programas, chame elas de “cadastros” ou de “telas”, pois todas elas elas fazem parte de um mesmo programa o “Aplicativo empresa”.

Bom, da pra ver que está fazendo um sistema grande, mas não está legal você “costurar a colcha de retalhos”.

Como você tem bastante telas diferentes, já está evidente a falta da implementação do padrão MVC e é por isso que está cada vez mais complicado você trocar mensagens entre seus JPanels e o JFrame que possui os menus.

Falta aí uma camada controladora entre as classes de domínio e/ou as entidades e as classes de apresentação.

Mas isso não é algo trivial de fazer e existem N formas de implementar.

Eu sugiro que dê uma pausa no desenvolvimento desse sistema e dê uma estudada no MVC.

1 curtida

Você recomenda alguma bibliografia. Pode ser pdf ou algum livro que desenvolva bem o tema MVC. Acho que existe carência em material escrito de técnicas de programação java. Digo, as formas profissionais de implementação de sistemas particularmente em Java. Sim, porque os algoritmos mais eficientes já estão consolidados.

Acho que sua dificuldade não é o Java mas os conceitos de programação orientada à objetos e boas práticas de desenvolvimento.

Tenho a impressão que você está pulando etapas no seu aprendizado.

Java Efetivo é um ótimo livro, mas você já tem que conhecer boa parte da API para entender bem as dicas desse livro.

Padrões de Projeto é um livro que gosto muito, mas ele exige alguma experiência com programação orientada à objetos.

Tem certeza? Não é o que parece nesse código por exemplo:

public void atualizarCampos() {
    clientes.cliente.setId_cgc_cpf(tfId_cgc_cpf.getText());
    if(clientes.localizar()) {
        if(clientes.cliente.getFisica_juridica().equals("1")) 
            {cbFisJur.setSelectedIndex(0);}
        else
            {cbFisJur.setSelectedIndex(1);}
        tfId_cgc_cpf.setText(clientes.cliente.getId_cgc_cpf());
        tfNome_razao.setText(clientes.cliente.getNome_razao());
        tfEmail.setText(clientes.cliente.getEmail());
        tfTelefone.setText(clientes.cliente.getTelefone());
        tfCep.setText(clientes.cliente.getCep());
        tfEndereco.setText(clientes.cliente.getEndereco());
        tfNumero.setText(clientes.cliente.getNumero());
        tfComplemento.setText(clientes.cliente.getComplemento());
        tfBairro.setText(clientes.cliente.getBairro());
        tfCidade.setText(clientes.cliente.getCidade());
        if(clientes.cliente.getEstado().equals("AC")) { cbEstado.setSelectedIndex(0); }
        else if(clientes.cliente.getEstado().equals("AL")) { cbEstado.setSelectedIndex(1); }
        else if(clientes.cliente.getEstado().equals("AP")) { cbEstado.setSelectedIndex(2); }
        else if(clientes.cliente.getEstado().equals("AM")) { cbEstado.setSelectedIndex(3); }
        else if(clientes.cliente.getEstado().equals("BA")) { cbEstado.setSelectedIndex(4); }
        else if(clientes.cliente.getEstado().equals("CE")) { cbEstado.setSelectedIndex(5); }
        else if(clientes.cliente.getEstado().equals("ES")) { cbEstado.setSelectedIndex(6); }
        else if(clientes.cliente.getEstado().equals("GO")) { cbEstado.setSelectedIndex(7); }
        else if(clientes.cliente.getEstado().equals("MA")) { cbEstado.setSelectedIndex(8); }
        else if(clientes.cliente.getEstado().equals("MT")) { cbEstado.setSelectedIndex(9); }
        else if(clientes.cliente.getEstado().equals("MS")) { cbEstado.setSelectedIndex(10); }
        else if(clientes.cliente.getEstado().equals("MG")) { cbEstado.setSelectedIndex(11); }
        else if(clientes.cliente.getEstado().equals("PA")) { cbEstado.setSelectedIndex(12); }
        else if(clientes.cliente.getEstado().equals("PB")) { cbEstado.setSelectedIndex(13); }
        else if(clientes.cliente.getEstado().equals("PR")) { cbEstado.setSelectedIndex(14); }
        else if(clientes.cliente.getEstado().equals("PE")) { cbEstado.setSelectedIndex(15); }
        else if(clientes.cliente.getEstado().equals("PI")) { cbEstado.setSelectedIndex(16); }
        else if(clientes.cliente.getEstado().equals("RJ")) { cbEstado.setSelectedIndex(17); }
        else if(clientes.cliente.getEstado().equals("RN")) { cbEstado.setSelectedIndex(18); }
        else if(clientes.cliente.getEstado().equals("RS")) { cbEstado.setSelectedIndex(19); }
        else if(clientes.cliente.getEstado().equals("RO")) { cbEstado.setSelectedIndex(20); }
        else if(clientes.cliente.getEstado().equals("RR")) { cbEstado.setSelectedIndex(21); }
        else if(clientes.cliente.getEstado().equals("SC")) { cbEstado.setSelectedIndex(22); }
        else if(clientes.cliente.getEstado().equals("SP")) { cbEstado.setSelectedIndex(23); }
        else if(clientes.cliente.getEstado().equals("SE")) { cbEstado.setSelectedIndex(24); }
        else if(clientes.cliente.getEstado().equals("TO")) { cbEstado.setSelectedIndex(25); }
        else if(clientes.cliente.getEstado().equals("DF")) { cbEstado.setSelectedIndex(26); }
        else if(clientes.cliente.getEstado().equals("")) { cbEstado.setSelectedIndex(27); }
        tfData_cadastro.setText(clientes.cliente.getData_cadastro());
        setBotoes(true, true, false, true, true, true);
    } else {
        JOptionPane.showMessageDialog(null, "Cliente não encontrado! " + clientes.cliente.getId_cgc_cpf());
        limparCampos();
    }
}

Perceba quantas vezes você acessou o atributo cliente do objeto clientes e quantas vezes chamou o método getEstado().

Qual o motivo de não usar uma variável local para acessar cliente uma única vez?
E essa montoeira de equals para decidir qual posição selecionar no combobox?

1 curtida

Seus códigos revelam certa inexperiência, mas com toda essa dedicação, creio que seguindo as dicas dos amigos desenvolvedores, você tem tudo pra se tornar um ótimo desenvolvedor.

Mas lembre-se, grandes voos pedem asas fortes.

Se quer algo profissional, pensa em camadas, separar a apresentação da lógica do negócio faz todo o sentido.

Bons Códigos e Sucesso !

2 curtidas