Aprenda Java com Interface Swing

  • Página Inicial
  • Contato!
  • Tudo sobre Java com Interface Swing Parte 1!
  • Tudo sobre Java com Interface Swing Parte 2!
  • Tudo sobre Java com Interface Swing Parte 3!
  • Tudo sobre Java com Interface Swing Parte 1

    Criando Tela de Login (JFrame)

    Crie um novo projeto, desmarque a opção de classe principal, e crie um pacote para colocar as telas e outro pra colocar as imagens.

    Crie um novo JFrame com o nome TelaLogin, e coloque nele um JPanel (painel), de forma que ele cubra um pouco mais da metade do frame. Agora coloque, dentro do painel, um label (escrito Login, clique nele com o botão direito para editar) e um campo de texto pro login (variável txtLogin), e também outro label (escrito senha) e um campo de senha para a senha (variável txtSenha). Coloque também um botão com o texto Entrar (variável btnEntr).

    No frame, fora do painel, coloque um label para colocar a imagem (clicando com o botão direito em propriedades, em icon e selecionando ela no pacote que ela está), e apague o texto do label.

    PS: Cuidado com a centralização dos componentes, principalmente imagens, para não desalinharem ao maximixar, para isso, deixe as laterais do layout como "redimensionável", clicando com o botão direito.

    No botão, clique em Action e em Action Performed, e coloque esse código, só para testarmos:

    
    private void btnEntrActionPerformed(java.awt.event.ActionEvent evt) {                                        
        if(txtLogin.getText().trim().equals("usuario") && String.valueOf(txtSenha.getPassword()).trim().equals("1234")) {
            JOptionPane.showMessageDialog(null, "Bem-vindo", "Login", JOptionPane.INFORMATION_MESSAGE); // Importe javax.swing.JOptionPane
        }
        else {
            JOptionPane.showMessageDialog(null, "Acesso Negado", "Login", JOptionPane.ERROR_MESSAGE);
        }
    }
    
    

    PS: Veja que tivermos que formar uma criação de String no txtSenha, porque o campo de senha envia um vetor de char, mas o Java precisa trabalhar com string, nesse caso.

    Para verificar o resultado, dê Shift F6.

    PS: Caso queira que, além do botão, ele seja executado ao clicar enter, podemos usar o evento Key e KeyPressed nas caixas de texto, numéricas e outros, e escolher dentro do método a tecla que deverá ser pressionada, assim:

    
    private void txtSenhaKeyPressed(java.awt.event.KeyEvent evt) {                                    
        if(evt.getKeyCode() == KeyEvent.VK_ENTER) { // Podemos utilizar outra tecla aqui, importe java.awt.event.KeyEvent
            // Coloque o mesmo código aqui.
        }
    }  
    
    

    Centralizando e Colocando Título do JFrame

    Para colocar título no frame, clicamos nas propriedades do Frame, e em Title colocamos o título desejado. Lá também tem a opção resizable, na qual podemos desmarcar para impedir que o frame seja redimensionado.

    Já para centralizar o frame, nas propriedades, vamos em código e marcar a opção Gerar Centralizado.

    PS: Há quem prefira fazer esses processos manualmente, já que alguns acusam as IDEs de Java de deixarem o programador "preguiçoso", esse é o código, que deverá ser colocado no construtor do frame:

    
    public TelaLogin() {
        initComponents();
        setLocationRelativeTo(null); // Para centralizar
        setTitle("Título"); // Para colocar título
        setResizable(false); // Para não redimensionar
    }
    
    

    Barra de Menu JMenuBar

    Crie um novo frame com o nome TelaPrincipal, siga os passos para centralizar, não redimensionar e colocar título.

    Pega uma Barra de Menu, e coloque os itens como Arquivo, Usuários, Clientes e Sobre (os dois primeiros podem ser editados, os outros adicionados mediante a paleta ou clicando com o botão direito). Podemos da mesma forma que os itens, colocar separadores.

    Através da paleta ou do clique com botão direito, coloque os itens de menu em cada menu, de forma que fiquem assim:

    PS: Nos menus e nos itens de menu podemos colocar ícones, da mesma forma que colocamos as imagens em labels e outros elementos. Coloque ícones em todos os menus e seus itens.

    Também podemos adicionar atalhos em itens de menus (como algum seguido de Ctrl ou Alt), indo em propriedades e Accelerator, independente do tipo de menu.

    Janelas Internas JInternalFrame

    Copie a tela principal, com os nomes TelaPrincipalMDI e TelaPrincipalSDI, que usaremos para projetos futuros.

    Crie um JInternalFrame (este será aberto dentro de outro frame), com o nome TelaCadastroUsuario. Dentro dele, coloque um painel e o estenda ao tamanho total da tela. Nela coloque os labels com os nomes Usuário, Senha e Confirmar Senha, e coloque um campo de texto para usuário (variável txtUser), e dois campos de senha para senha e confirmar senha (variáveis txtSenha e txtConf, respectivamente). Coloque também um botão pra salvar (variável btnSalv).

    Note também que esse frame não tem um método main, por isso não poderemos executar, mesmo com o shift. Teremos que chamar ele por outro frame que não seja internal.

    Para chamar o JInternalFrame, pegue o TelaPrincipalMDI, e coloque nela um painel da área de trabalho (desktop pane), e coloque no frame MDI até cobrir ele todo. e coloque a variável paneCadr.

    No TelaPrincipalMDI, clique no menu Usuário e em Cadastrar, clique com o botão direito e vá em Action e Action Perfomed, e coloque esse código:

    
    TelaCadastroUsuario telaCadUser = new TelaCadastroUsuario();
    
    paneCadr.add(telaCadUser);
    
    telaCadUser.setVisible(true);
    
    

    Aplicação SDI - JFrame

    Crie um JFrame com o nome TelaCadastroUsuarioSDI, e coloque o painel, os labels e campos de texto e senha exatamente iguais ao do MDI (pode até copiar o painel diretamente e colar).

    No TelaPrincipalSDI, clique no menu Usuário e em Cadastrar, clique com o botão direito e vá em Action e Action Perfomed, e coloque esse código:

    
    new TelaCadastroUsuarioSDI().setVisible(true);
    
    

    PS: Caso queira que a tela principal não feche ao fechar também o frame de cadastro, vá no TelaCadastroUsuarioSDI e coloque na opção defaultCloseOperation a opção DISPOSE.

    Máscaras CPF, Telefone e Data

    Primeiramente, crie um JFrame com o nome TelaCadastroCliente, aumente o tamanho dele e coloque um painel que cubra toda a extensão dele.

    Por cima, coloque outro painel que cubra a metade superior dele, e nesse painel, em propriedades, vá na opção border e escolha a borda com título, e no título coloque o texto "dados pessoais".

    Dentro dele coloque os labels e campos para nome, data, CPF e uma caixa de combinação (tipo select) pro sexo. Só que o de data e de CPF será o campo formatado.

    Para mudar os dados da caixa de combinação, clique nela com o botão direito, e em propriedades, em model, coloque as opções, separadas por linha.

    Crie outro painel, na parte de baixo, com borda com título, com o título Contato. Nele coloque os labels e os campos telefone, celular (esses dois serão formatados) e e-mail.

    Para colocar as máscaras, clicamos no campo com o botão direito, vai em propriedades e em formattedFactory, em máscara e em personalizado. No campo formatado, colocaremos os campos, onde os números a serem inseridos são representados por hashtags e os outros símbolos são apenas pra formatação, não sendo considerados ou podendo ser apagados no programa.

    Esses são os exemplos que usaremos nesse frame (podendo ser usado várias outras combinações):

    PS: A hashtag (#) só aceita números, para letras usamos ?, letras e números usamos A, qualquer coisa usamos * e hexadecimais usamos H. Uma máscara de placas de veículos poderia ser ???-####, por exemplo.

    Coloque, fora dos paineis menores, logo abaixo, um botão pra salvar.

    Altere os nomes das variáveis dos campos (tfNome, tfData, tfCPF, cxSex, tfTel, tfCel e tfMail).

    Coloque esse código no método action do botão:

    
    private void btnSalvActionPerformed(java.awt.event.ActionEvent evt) {                                        
        JOptionPane.showMessageDialog(null, "Nome: " + tfNome.getText().trim() + "\nSexo: " + cxSex.getSelectedItem().toString(), "Notificação", JOptionPane.INFORMATION_MESSAGE); // Importe javax.swing.JOptionPane
    
        DateTimeFormatter formato = DateTimeFormatter.ofPattern("dd/MM/yyyy"); // Importe java.time.format.DateTimeFormatter
        LocalDate dataUSA = LocalDate.parse(tfData.getText().trim(), formato); // Import java.time.LocalDate
        System.out.println(dataUSA);
    
        JOptionPane.showMessageDialog(null, "Data Formato Brasileiro: " + tfData.getText().trim() + "\nData Formato Americano: " + dataUSA, "Datas", JOptionPane.INFORMATION_MESSAGE);
    
        long cpfNum = Long.parseLong(tfCPF.getText().trim().replaceAll("[^0-9]", ""));
    
        JOptionPane.showMessageDialog(null, "CPF em String: " + tfCPF.getText().trim() + "\nCPF em Long: " + cpfNum, "CPF", JOptionPane.INFORMATION_MESSAGE);
    }
    
    

    Podemos criar outras formatações, algumas a própria IDE nos fornece de opção, como pra formatar moedas.

    PS: Note que tivemos que converter os dados da caixa de combinação para String, porque esse componente envia um objeto, o que pode dar erro em algumas situações como as com banco de dados. O mesmo vale para converter a data, que são armazenadas nos bancos com padrão americano. Fizemos um método também para converter o número de CPF para um número long, caso deseje que seja colocado assim no banco, pode ser aplicado aos telefones também.

    Usando CardLayout

    Crie um JFrame com o nome TelaCardLayout, e nela coloque um menu bar com o nome Telas e dois itens, Outubro Rosa e Novembro Azul, e as variáveis equivalentes.

    Coloque um painel com a variável paneCard e preencha o frame todo com ele, e em definir Layout, clique na opção Layout do Cartão, e coloque acima dele outros dois paineis e faça o mesmo, só que esses dois paineis deverão ser filhos do principal, altere as variáveis deles para paneAzul e paneRosa. Para colocar as cores equivalentes, so ir em background e escolhê-las

    Nas propriedades do paneRosa e paneAzul, defina os nomes do cartão como tela1 e tela2.

    Esse é o código dos menus:

    
    private void itOutRosaActionPerformed(java.awt.event.ActionEvent evt) {                                          
        CardLayout c1 = (CardLayout)paneCard.getLayout(); // Importe java.awt.CardLayout
    
        c1.show(paneCard, "tela1");
    }
    
    private void itNovAzulActionPerformed(java.awt.event.ActionEvent evt) {                                          
        CardLayout c1 = (CardLayout)paneCard.getLayout();
    
        c1.show(paneCard, "tela2");
    }     
    
    

    Isso é útil também para quem quer fazer duas ou mais telas nessas opções, com componentes e funções diferentes, por exemplo.

    Criando JPopupMenu

    Primeiro, crie um novo frame com o nome TelaPopupMenu, nela que criaremos um menu pop-up (aquele que aparece ao clicarmos com o botão direito.

    Coloque um campo de texto (variável txtMens), e um Menu Pop-up no frame (não se assuste se nada aparecer), então, para adicionarmos itens, iremos em navegador para achar ele, alteramos a variável para menuPop, e em adicionar da paleta, adicione os itens de menu, no caso, serão três.

    Para exibir o menu, clique no frame, e nos Eventos, vá em Mouse e em MouseReleased (que é o clique do botão direito). Veja o código abaixo:

    
    private void formMouseReleased(java.awt.event.MouseEvent evt) {                                   
        if(evt.isPopupTrigger()) { // Retorna um valor booleano
            menuPop.show(this, 50, 50); // Os números definem a posição do popup.
        }
    }
    
    

    PS: Caso queira que o pop-up apareça no local clicado, basta alterar o código dessa forma:

    
    menuPop.show(this, evt.getX(), evt.getY()); 
    
    

    Lembrando que, caso queira que esse menu apareça dentro de algum componente, como um painel ou campo, no lugar do this colocamos a variável referente a esse objeto, e coloque o evento do mouse no componente desejado, no caso poderia ser assim:

    
    menuPop.show(txtMens, 200, evt.getY()); 
    
    

    Dessa forma, podemos por exemplo, criar os itens copiar e selecionar tudo, crie os itens de menu com esses nomes, coloque o atalho de teclado no Accelerator (em propriedades, no caso seria Ctrl C e Ctrl A, respectivamente) e altere o nome das variáveis. Coloque também um campo de texto no frame com a variável txtMens.

    Esse é o código para copiar o texto do campo para a área de transferência do PC:

    
    txtMens.copy();
    
    

    Esse é para recortar:

    
    txtMens.cut();
    
    

    Para selecionar tudo em um campo de texto, basta isso:

    
    txtMens.grabFocus();
    
    txtMens.selectAll();
    
    

    Esse é um exemplo que poderíamos usar para colar:

    
    txtMens.paste();
    
    

    E esse é um método que poderia ser criado para excluir texto:

    
    try {
        String texto = txtMens.getSelectedText();
    
        String recorte = txtMens.getText().replace(texto, ""); // Não coloque o trim
    
        txtMens.setText(recorte);
    }
    catch(NullPointerException ex) {
        // Pode deixar vazio mesmo
    }
    
    

    Criando Tela de Login com JDialog

    Crie uma JFrame com um botão denominado TelaEntrada para fazermos nosso projeto. Essa tela não estará clicável enquanto nossa tela de login estiver aberta, de forma semelhante aos JOptionPane.

    Para criar a tela dessa forma, crie no pacote view um Form JDialog com o nome TelaLoginModal, e nela crie um painel, e os campos de login, senha e botão iguais à outra tela de login (pode até copiar o painel diretamente e colar nele). Também, como nos frames, podemos centralizar, colocar título e impedir o redimensionamento nos JDialogs também.

    No código do TelaLoginModal, coloque as variáveis acima do construtor dele, dessa forma:

    
    public String login;
    public String senha;
    
    public TelaLoginModal(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
    }
    
    

    E no método do botão, coloque isso:

    
    private void btnEntrActionPerformed(java.awt.event.ActionEvent evt) {                                        
        login = txtLogin.getText().trim();
        senha = String.valueOf(txtSenha.getPassword()).trim();
            
        if(login.equals("admin") && senha.equals("123")) {
            JOptionPane.showMessageDialog(null, "Bem-vindo", "Login", JOptionPane.INFORMATION_MESSAGE); // Importe javax.swing.JOptionPane
        
            this.dispose(); // Isso fecha a janela JDialog
        }
        else {
            JOptionPane.showMessageDialog(null, "Acesso Negado", "Login", JOptionPane.ERROR_MESSAGE);
        }
    } 
    
    

    Voltando ao frame TelaEntrada, crie um label com a variável txtUser só pra vermos o nome do usuário logado.

    E no action do botão do TelaEntrada, coloque esse código:

    
    private void btnLoginActionPerformed(java.awt.event.ActionEvent evt) {                                         
        TelaLoginModal tlm = new TelaLoginModal(this, true);
    
        tlm.setVisible(true);
    
        txtUser.setText("Bem-Vindo, " + tlm.login + ".");
    }                                        
    
    

    Agora dê shift F6 no TelaEntrada pra testar.

    Melhorias Tela de Login JDialog

    Continuando o projeto anterior, vamos fazer umas melhorias, uma delas é bloquear o botão de fechar do Jdialog (que por default é usado um método dispose, que não fecha o frame junto).

    Para mostrar de cara a tela de login, ao iniciar o frame TelaEntrada, basta recortar os comandos do método do botão e colocar no construtor, assim:

    
    public TelaEntrada() {
        initComponents();
    
        TelaLoginModal tlm = new TelaLoginModal(this, true);
    
        tlm.setVisible(true);
    
        txtUser.setText("Bem-Vindo, " + tlm.login + ".");
    }
    
    

    Dessa forma, o botão do TelaEntrada pode até ser excluído.

    Para bloquear o botão de fechar do JDialog, coloque o método setDefaultCloseOperation com o valor 0, assim:

    
    public TelaLoginModal(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
    
        this.setDefaultCloseOperation(0);
    }
    
    

    E agora, coloque um botão com o nome Cancelar, e coloque apenas isso:

    
    System.exit(0);
    
    

    Barra de Rolagem JScrollPane

    Em alguns casos, como os de dispositivos com telas pequenas, o frame pode ficar menor e alguns componetes não estarem aparecendo, isso é facilmente resolvido com um scrollpane.

    Crie um JFrame com o nome TelaCadastroClienteScroll, e nele coloque um painel de rolagem e expanda ele pro tamanho total do frame, aí volte pro TelaCadastroCliente e copie o painel com todos os elementos e cole no TelaCadastroClienteScroll