[DÚVIDA] SWING / SWITCH e OO

Galera, estava aprendendo um pouco de Swing aqui e encontrei na net ensinando a criar uma tela de login, eu achei muito complicado pra falar a verdade e acredito que tenha como fazer de uma forma mais simples. Vou lançar meu código e depois as dúvidas.


package Login;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Login extends JFrame {

	private JLabel label1;
	private JLabel label2;
	private JTextField campoTexto1;
	private JPasswordField campoSenha1;
	private JButton botao1;
	private JPanel painel;

	public Login() {

		super();
		create();
		this.setVisible(true);

	}

	private void create() {

		label1 = new JLabel();
		label2 = new JLabel();
		campoTexto1 = new JTextField();
		campoSenha1 = new JPasswordField();
		botao1 = new JButton();
		painel = new JPanel();

		// label1
		label1.setHorizontalAlignment(SwingConstants.LEFT);
		label1.setForeground(new Color(0, 0, 255));
		label1.setText("Usuário");

		// label2
		label2.setHorizontalAlignment(SwingConstants.LEFT);
		label2.setForeground(new Color(0, 0, 255));
		label2.setText("Usuário");

		// campoTexto1
		campoTexto1.setForeground(new Color(0, 0, 255));
		campoTexto1.setSelectedTextColor(new Color(0, 0, 255));
		campoTexto1.setToolTipText("Entre com seu usuário");
		campoTexto1.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				campoTexto1_actionPerformed(e);
			}

		});

		// campoSenha1
		campoSenha1.setForeground(new Color(0, 0, 255));
		campoSenha1.setSelectedTextColor(new Color(0, 0, 255));
		campoSenha1.setToolTipText("Entre com sua senha");
		campoSenha1.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				campoSenha1_actionPerformed(e);
			}
		});

		// botao1
		botao1.setBackground(new Color(204, 204, 204));
		botao1.setForeground(new Color(0, 0, 255));
		botao1.setToolTipText("LOGIN");
		botao1.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				campoTexto1_actionPerformed(e);
			}

		});

		// painel

		painel.setLayout(null);
		painel.setBorder(BorderFactory.createEtchedBorder());
		painel.setBackground(new Color(204, 204, 204));
		adicComponente(painel, label1, 5, 10, 106, 18);
		adicComponente(painel, label2, 5, 47, 97, 18);
		adicComponente(painel, campoTexto1, 110, 10, 183, 22);
		adicComponente(painel, campoSenha1, 110, 45, 183, 22);
		adicComponente(painel, botao1, 150, 75, 83, 28);

		// login
		this.setTitle("Login e Senha");
		this.setLocation(new Point(76, 182));
		this.setSize(new Dimension(335, 141));
		this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		this.setResizable(false);

	}

	private void adicComponente(Container container, Component c, int x, int y,
			int width, int height) {
		c.setBounds(x, y, width, height);
		container.add(c);
	}

	private void campoTexto1_actionPerformed(ActionEvent e) {
	}

	private void campoSenha1_actionPerformed(ActionEvent e) {
	}

	private void botao1_actionPerformed(ActionEvent e) {
		System.out.println("\n TESTE");
		String usuario = new String(campoTexto1.getText());
		String senha = new String(campoSenha1.getText());

		if (usuario.equals("") || senha.equals("")) {
			botao1.setEnabled(false);
			JLabel errorFields = new JLabel(
					"<HTML><FONT COLOR = Blue>Favor inserir usuário e senha!</FONT></HTML>");
			JOptionPane.showMessageDialog(null, errorFields);
			campoTexto1.setText("");
			campoSenha1.setText("");
			botao1.setEnabled(true);
			this.setVisible(true);

		} else {
			JLabel optionLabel = new JLabel("<HTML><FONT COLOR = Blue>Você entrou </FONT><FONT COLOR = RED> <B>"+usuario+"</B></FONT> <FONT COLOR = Blue> como seu usuário.<BR> Está correto?</FONT></HTML>");
			int confirm =JOptionPane.showConfirmDialog(null,optionLabel);
		}
		
		switch(confirm) {
		
		case JOptionPane.YES_OPTION:
			botao1.setEnabled(false);
			break;
		
		case JOptionPane.NO_OPTION:
			botao1.setEnabled(false);
			campoTexto1.setText("");
			campoSenha1.setText("");
			botao1.setEnabled(true);
			break;
		
		case JOptionPane.CANCEL_OPTION:
			botao1.setEnabled(false);
			campoTexto1.setText("");
			campoSenha1.setText("");
			botao1.setEnabled(true);
			break;
		}

	}
}

E a classe MAIN

package Login;

import javax.swing.*;

public class LoginMain {

	public static void main(String[] args) {
		JFrame.setDefaultLookAndFeelDecorated(true);
		JDialog.setDefaultLookAndFeelDecorated(true);
		try {
			UIManager
					.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
		} catch (Exception ex) {
			System.out.println("Failed loading L&F: ");
			System.out.println(ex);
		}
		new Login();
	};

}

As dúvidas que tenho são:

1 - No Eclipse me informa que no SWITCH feito no final da classe Login tem alguma coisa errada, mas não saquei o erro.

2 - Como eu estava aprendendo direto de um site que já tinha as classes prontas teve um TRY no MAIN que deu erro, e pelo o que eu entendi, o motivo é por eu usar LINUX.

		try {
			UIManager
					.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

O erro:
Failed loading L&F:
javax.swing.UnsupportedLookAndFeelException: [The Microsoft Windows Look and Feel - com.sun.java.swing.plaf.windows.WindowsLookAndFeel] not supported on this platform

3 - Vocês acham que da pra dividir toda essa classe Login em várias classes deixando mais OO?

Valeu …/

1 - Voce está fazendo switch em uma variável (confirm) fora de escopo, ela foi declarada dentro do ‘if’ e não está visível para o switch… ou você coloca ela fora do ‘if’, ou coloca o switch pra dentro do ‘if’ …

2 - Provavelmente sim… dependendo da distribuição que você usa, não existem as bibliotecas e resources necessários para exibir uma janela com look-and-feel do Windows… acontece… =/

3 - Eu acho que não tem muita coisa pra melhorar ai, não… voce pode criar mais médotos, por exemplo, pra carregar os componentes, apenas para uma legibilidade melhor… alguem sugere mais alguma coisa ? :roll:

[quote=marcelo.bellissimo]1 - Voce está fazendo switch em uma variável (confirm) fora de escopo, ela foi declarada dentro do ‘if’ e não está visível para o switch… ou você coloca ela fora do ‘if’, ou coloca o switch pra dentro do ‘if’ …

2 - Provavelmente sim… dependendo da distribuição que você usa, não existem as bibliotecas e resources necessários para exibir uma jenal com look-and-feel do Windows… acontece… =/

3 - Eu acho que não tem muita coisa pra melhorar ai, não… voce pode criar mais médotos, por exemplo, pra carregar os componentes, apenas para uma legibilidade melhor… alguem sugere mais alguma coisa ? :roll: [/quote]

Legal, a 1 realmente foi falta de atenção.

A 2 é SACANAGEMMMM, será que tem alguma solução para eu conseguir fazer uso dessa classe em várias distros?

3 - Eu vou pensar um pouco mais.

Valeu :twisted:

Alguém? …/

Boa noite a todos.

A primeira pergunta o nosso amigo Marcelo.bellissimo já respondeu.

Quanto a segunda pergunta, o Look and Feel deveria ser declarado dentro da classe Login e configurado dentro do seu construtor e não dentro da classe Main

public Login() {   
  
        super();   
        create();
        setDefaultLookAndFeelDecorated(true);   
        try {   
            UIManager   
                    .setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");   
        } catch (Exception ex) {   
            System.out.println("Failed loading L&F: ");   
            System.out.println(ex);   
        }   
  
        this.setVisible(true);   
  
    }   

A classe Main fica assim

package Login;   
  
import javax.swing.*;   
  
public class LoginMain {   
  
    public static void main(String[] args) {      
        new Login();   
    };   
  
}  

Quanto a terceira pergunta, realmente dá sim para enxugar mais este código, no entanto deixa eu te passá-lo amanhã, por que no momento eu não estou com esse código aqui máquina, e sim no meu laptop, amanhã sem falta eu te passo ele.

Legal, valeu pela atenção.

É amanha mesmo que vou fuçar um pouco mais nele.

Grato.

Olá, como prometi, cá estou eu de novo.

Bom, para começarmos a enxugar esse código, é só analisá-lo e perceber o que faz ele ficar tão extenso é o código da criação de componentes e diagramar (colocar nos Forms) todos eles de acordo conforme os mesmos são adicionados pelo método "adicComponente(…);

Imagine voce, escrevendo todo este código em todos os Frames (Forms) que voce cria :?: :?: :?:

Mas pera ai, eu não sei quais os componentes previamente que irei colocar nos Frames que irei criar, isto varia de acordo com campos de tabela. Tudo bem, porém voce pode definir um layout padrão dos quais voce não precisará escrever a toda hora, e o layout mais versátil que encontrei até hoje no Java é o GridBagLayout, e ele eu defini numa classe que extende (herda) de um JPanel, assim:

package principal;

import java.awt.Color;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.ImageIcon;

public class ContentLayout extends JPanel {

    // Declaração dos atributos do Layout e de constraints do Layout
    private GridBagLayout layout;
    private GridBagConstraints constraints;
    public final int horizontal = GridBagConstraints.HORIZONTAL;
    public final int both = GridBagConstraints.BOTH;

    //Construtor do objeto (como o mesmo nome da classe)
    public ContentLayout(){
       layout = new GridBagLayout();
       setLayout(layout);
       constraints = new GridBagConstraints();
       constraints.weightx = 0;
       constraints.weighty = 0;
       constraints.insets = new Insets(5,5,5,5);
    }

    public void addComponent(Component comp, int row, int column, int width, int height, int fill){
        constraints.fill = fill;
        constraints.gridx = column;
        constraints.gridy = row;
        constraints.gridwidth = width;
        constraints.gridheight = height;
        layout.setConstraints(comp, constraints);
        add(comp);
    }

    public void setBorda(Color color, int thickness){
        setBorder(BorderFactory.createLineBorder(color, thickness));
    }

    public ImageIcon getImageIcon(String filename){
        File path = new File("");
        String dir = path.getAbsolutePath();
        return new ImageIcon(dir+"/Imagens/"+filename);
    }

}

Agora vamos criar o formulario login, onde vamos inserir o ContentLayout, no layout do login através do seu método setContentPane(…), assim:

package principal;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Color;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.JOptionPane;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class FrameLogin extends JDialog implements ActionListener, KeyListener {

    private JTextField txtlogin;
    private JPasswordField txtpassword;
    private JButton btnok, btncancel;
    private String mens;
    private Boolean response = false;
    private int accessdenied = 3;

    public FrameLogin(JFrame parent){
        super(parent, "Acesso ao programa", true);
        setContentPane(getContainer());
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        pack();
        setLocationRelativeTo(this);
        setVisible(true);
    }

    public ContentLayout getContainer(){
       ContentLayout container = new ContentLayout();
       Font font = new Font("Tahoma", 0, 14);
       JLabel image = new JLabel(container.getImageIcon("acesso.png"));
       container.addComponent(image,0,0,4,4,container.horizontal);
       JLabel lblogin = new JLabel("Digite o seu login......");
       lblogin.setFont(font);
       container.addComponent(lblogin,4,0,1,1,container.horizontal);
       txtlogin = new JTextField(10);
       txtlogin.setFont(font);
       txtlogin.addKeyListener(this);
       container.addComponent(txtlogin,4,1,3,1,container.horizontal);
       JLabel lblpassword = new JLabel("Digite a sua senha.....");
       lblpassword.setFont(font);
       container.addComponent(lblpassword,5,0,1,1,container.horizontal);
       txtpassword = new JPasswordField(10);
       txtpassword.setFont(font);
       container.addComponent(txtpassword,5,1,3,1,container.horizontal);
       btnok = new JButton("OK");
       btnok.addActionListener(this);
       container.addComponent(btnok,6,0,2,1,container.horizontal);
       btncancel = new JButton("Cancelar");
       btncancel.addActionListener(this);
       container.addComponent(btncancel,6,2,2,1,container.horizontal);
       container.setBorda(new Color(0,0,0), 2);
       return container;
    }

    // Verifica se os campos estão vazios:
    private Boolean checkTextField(){
        Boolean result = false;
        if ("".equals(txtlogin.getText())){
            mens = "Campo login em branco.\n";
            mens += "Digite o login";
        } else if ("".equals(txtpassword.getText())){
            mens = "Campo senha em branco.\n";
            mens += "Digite a senha";
        } else {
            result = true;
        }
        if (!result) JOptionPane.showMessageDialog(this,mens,"Erro",JOptionPane.ERROR_MESSAGE);
        return result;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource()==btncancel){
            setResponse(false);
        } else if (e.getSource()==btnok){
            if (checkTextField()){
               setResponse(logon());
               if (!getResponse() && accessdenied >= 0) return;
            } else {
               return;
            }
        }
        setVisible(false);
        dispose();
    }

    /* Aqui é o método que fará a conexão com o seu banco de dados, para
       autenticação do usuário, e isto vai depender de como voce fará esta 
       conexão, por isso vou te passar mais ou menos o algoritimo supondo
       que voce possui um método getConnection numa classe Conexao; */

    private Boolean logon(){
        Conexao con = new Conexao();
        PrepareStatment ps = con.getConnection().CreateStatement();
        String sql = "Select * from usuario where login = '" + txtlogin.getText();
        sql += "' and senha = '" + txtpassword.getText() + "'";
        try { 
             ResultSet rs = ps.executeQuery(sql);
             if (rs.next()){
                 return true;
             } else {
                 verifyChances();
                 return false;        
             }
        } catch (Exception ex) {
             String message = "Houve algum problema com a conexão do banco de dados.\n";
             message += "Registros não foram recuperados".\n" + ex.getMessage();
             JOptionPane.showMessageDialog(null,message,"Erro",JOptionPane.ERROR_MESSAGE);
             accessdenied = -1;
             return false;
        }
    }

    // Método que define tres chances para voce se logar corretamento
    private void verifyChances(){
        String ch;
        if (accessdenied==0){
            mens = "Voce não tem mais chances.\n";
            mens += "O programa será fechado.";
        } else {
            if (accessdenied==1){
                ch = " chance\n";
            } else {
                ch = " chances\n";
            }
            mens = "Voce só tem agora "+accessdenied+ch;
            mens += "de digitar o login e senha corretamente.";
            txtlogin.setText("");
            txtpassword.setText("");
        }
        accessdenied--;
        JOptionPane.showMessageDialog(null,mens,"Acesso negado",JOptionPane.WARNING_MESSAGE);
    }


    @Override
    public void keyTyped(KeyEvent e){
        // Método não utilizado
    }

    @Override
    public void keyPressed(KeyEvent e){
        // Método não utilizado
    }

    @Override
    public void keyReleased(KeyEvent e) {
        txtlogin.setText(txtlogin.getText().toUpperCase());
    }

    public Boolean getResponse() {
        return response;
    }

    public void setResponse(Boolean response) {
        this.response = response;
    }

}

Quero que voce observe duas coisas, a primeira delas é aqui:

public ImageIcon getImageIcon(String filename){
        File path = new File("");
        String dir = path.getAbsolutePath();
        return new ImageIcon(dir+"/Imagens/"+filename);
    }

Dentro da pasta do seu projeto, crie uma pasta Imagens e dentro dela coloque qualquer imagen com o nome de "acesso.png", isto vai colocar uma imagem dentro do frame Login exatamente dentro da classe Login aqui neste código:

....
 JLabel image = new JLabel(container.getImageIcon("acesso.png"));
....

A outra, é que voce pode usar a classe ContentLayout para diagramar (colocar) qualquer componente em qualquer Frame que queira, não presisando mais definir os requisitos de GridBagLayout

Mais tarde te explico como utilizar o método addComponent(…) e seus parâmentros.

Um abraço.

Nossa, esse ficou legal, tem bastante informação boa quanto restringir acesso, vou almoçar e vou examinar passo a passo e dou um retorno.

Muito grato pela atenção.

  1. O LookAndFeel do Windows é exclusivo para o Windows. Assim como o GTK é exclusivo para plataformas que rodam o GNOME e assim por diante. Para ter um visual consistente em todas as plataformas faça o seguinte: ao invés de definir o nome da classe manualmente use o método “UIManager.getSystemLookAndFeelClassName()”. Ele se encarrega de sempre deixar o seu programa com a cara do SO em que ele roda.

  2. Fuja sempre de null leiaute. Use algum gerenciador que as coisas ficarão mais fáceis (particularmente sugiro o MigLayout).

  3. Sempre que for fazer pesquisas em banco separe as responsabilidades criando uma classe DAO. E nessa classe sempre use PreparedStatement (para evitar erros bobos de caracteres de escape ou ataques de SQL injection).

[quote=discorpio]Olá, como prometi, cá estou eu de novo.

Bom, para começarmos a enxugar esse código, é só analisá-lo e perceber o que faz ele ficar tão extenso é o código da criação de componentes e diagramar (colocar nos Forms) todos eles de acordo conforme os mesmos são adicionados pelo método "adicComponente(…);

Imagine voce, escrevendo todo este código em todos os Frames (Forms) que voce cria :?: :?: :?:

Mas pera ai, eu não sei quais os componentes previamente que irei colocar nos Frames que irei criar, isto varia de acordo com campos de tabela. Tudo bem, porém voce pode definir um layout padrão dos quais voce não precisará escrever a toda hora, e o layout mais versátil que encontrei até hoje no Java é o GridBagLayout, e ele eu defini numa classe que extende (herda) de um JPanel, assim:

package principal;

import java.awt.Color;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.ImageIcon;

public class ContentLayout extends JPanel {

    // Declaração dos atributos do Layout e de constraints do Layout
    private GridBagLayout layout;
    private GridBagConstraints constraints;
    public final int horizontal = GridBagConstraints.HORIZONTAL;
    public final int both = GridBagConstraints.BOTH;

    //Construtor do objeto (como o mesmo nome da classe)
    public ContentLayout(){
       layout = new GridBagLayout();
       setLayout(layout);
       constraints = new GridBagConstraints();
       constraints.weightx = 0;
       constraints.weighty = 0;
       constraints.insets = new Insets(5,5,5,5);
    }

    public void addComponent(Component comp, int row, int column, int width, int height, int fill){
        constraints.fill = fill;
        constraints.gridx = column;
        constraints.gridy = row;
        constraints.gridwidth = width;
        constraints.gridheight = height;
        layout.setConstraints(comp, constraints);
        add(comp);
    }

    public void setBorda(Color color, int thickness){
        setBorder(BorderFactory.createLineBorder(color, thickness));
    }

    public ImageIcon getImageIcon(String filename){
        File path = new File("");
        String dir = path.getAbsolutePath();
        return new ImageIcon(dir+"/Imagens/"+filename);
    }

}

Agora vamos criar o formulario login, onde vamos inserir o ContentLayout, no layout do login através do seu método setContentPane(…), assim:

package principal;

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.Color;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.JOptionPane;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class FrameLogin extends JDialog implements ActionListener, KeyListener {

    private JTextField txtlogin;
    private JPasswordField txtpassword;
    private JButton btnok, btncancel;
    private String mens;
    private Boolean response = false;
    private int accessdenied = 3;

    public FrameLogin(JFrame parent){
        super(parent, "Acesso ao programa", true);
        setContentPane(getContainer());
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        pack();
        setLocationRelativeTo(this);
        setVisible(true);
    }

    public ContentLayout getContainer(){
       ContentLayout container = new ContentLayout();
       Font font = new Font("Tahoma", 0, 14);
       JLabel image = new JLabel(container.getImageIcon("acesso.png"));
       container.addComponent(image,0,0,4,4,container.horizontal);
       JLabel lblogin = new JLabel("Digite o seu login......");
       lblogin.setFont(font);
       container.addComponent(lblogin,4,0,1,1,container.horizontal);
       txtlogin = new JTextField(10);
       txtlogin.setFont(font);
       txtlogin.addKeyListener(this);
       container.addComponent(txtlogin,4,1,3,1,container.horizontal);
       JLabel lblpassword = new JLabel("Digite a sua senha.....");
       lblpassword.setFont(font);
       container.addComponent(lblpassword,5,0,1,1,container.horizontal);
       txtpassword = new JPasswordField(10);
       txtpassword.setFont(font);
       container.addComponent(txtpassword,5,1,3,1,container.horizontal);
       btnok = new JButton("OK");
       btnok.addActionListener(this);
       container.addComponent(btnok,6,0,2,1,container.horizontal);
       btncancel = new JButton("Cancelar");
       btncancel.addActionListener(this);
       container.addComponent(btncancel,6,2,2,1,container.horizontal);
       container.setBorda(new Color(0,0,0), 2);
       return container;
    }

    // Verifica se os campos estão vazios:
    private Boolean checkTextField(){
        Boolean result = false;
        if ("".equals(txtlogin.getText())){
            mens = "Campo login em branco.\n";
            mens += "Digite o login";
        } else if ("".equals(txtpassword.getText())){
            mens = "Campo senha em branco.\n";
            mens += "Digite a senha";
        } else {
            result = true;
        }
        if (!result) JOptionPane.showMessageDialog(this,mens,"Erro",JOptionPane.ERROR_MESSAGE);
        return result;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource()==btncancel){
            setResponse(false);
        } else if (e.getSource()==btnok){
            if (checkTextField()){
               setResponse(logon());
               if (!getResponse() && accessdenied >= 0) return;
            } else {
               return;
            }
        }
        setVisible(false);
        dispose();
    }

    /* Aqui é o método que fará a conexão com o seu banco de dados, para
       autenticação do usuário, e isto vai depender de como voce fará esta 
       conexão, por isso vou te passar mais ou menos o algoritimo supondo
       que voce possui um método getConnection numa classe Conexao; */

    private Boolean logon(){
        Conexao con = new Conexao();
        PrepareStatment ps = con.getConnection().CreateStatement();
        String sql = "Select * from usuario where login = '" + txtlogin.getText();
        sql += "' and senha = '" + txtpassword.getText() + "'";
        try { 
             ResultSet rs = ps.executeQuery(sql);
             if (rs.next()){
                 return true;
             } else {
                 verifyChances();
                 return false;        
             }
        } catch (Exception ex) {
             String message = "Houve algum problema com a conexão do banco de dados.\n";
             message += "Registros não foram recuperados".\n" + ex.getMessage();
             JOptionPane.showMessageDialog(null,message,"Erro",JOptionPane.ERROR_MESSAGE);
             accessdenied = -1;
             return false;
        }
    }

    // Método que define tres chances para voce se logar corretamento
    private void verifyChances(){
        String ch;
        if (accessdenied==0){
            mens = "Voce não tem mais chances.\n";
            mens += "O programa será fechado.";
        } else {
            if (accessdenied==1){
                ch = " chance\n";
            } else {
                ch = " chances\n";
            }
            mens = "Voce só tem agora "+accessdenied+ch;
            mens += "de digitar o login e senha corretamente.";
            txtlogin.setText("");
            txtpassword.setText("");
        }
        accessdenied--;
        JOptionPane.showMessageDialog(null,mens,"Acesso negado",JOptionPane.WARNING_MESSAGE);
    }


    @Override
    public void keyTyped(KeyEvent e){
        // Método não utilizado
    }

    @Override
    public void keyPressed(KeyEvent e){
        // Método não utilizado
    }

    @Override
    public void keyReleased(KeyEvent e) {
        txtlogin.setText(txtlogin.getText().toUpperCase());
    }

    public Boolean getResponse() {
        return response;
    }

    public void setResponse(Boolean response) {
        this.response = response;
    }

}

Quero que voce observe duas coisas, a primeira delas é aqui:

public ImageIcon getImageIcon(String filename){
        File path = new File("");
        String dir = path.getAbsolutePath();
        return new ImageIcon(dir+"/Imagens/"+filename);
    }

Dentro da pasta do seu projeto, crie uma pasta Imagens e dentro dela coloque qualquer imagen com o nome de "acesso.png", isto vai colocar uma imagem dentro do frame Login exatamente dentro da classe Login aqui neste código:

....
 JLabel image = new JLabel(container.getImageIcon("acesso.png"));
....

A outra, é que voce pode usar a classe ContentLayout para diagramar (colocar) qualquer componente em qualquer Frame que queira, não presisando mais definir os requisitos de GridBagLayout

Mais tarde te explico como utilizar o método addComponent(…) e seus parâmentros.

Um abraço.
[/quote]

Cara desculpa a demora ta corrido aqui.

Tava examinando aqui o código, não existe a possibilidade de fazer esse código utilizando MVC e dividir as funcionalidades em uma classe e a parte gráfica em outra classe?

Eu to começando a aprender a usar banco de dados agora, rs.

Muito grato pela resposta.