Normalmente, fazemos o seguinte…
passo 1:
Abrir a tela de login (e somente ela) para que o usuário possa se logar no sistema.
passo 2:
O usuário coloca seu usuário e senha e clica em “login”
passo 3:
As credenciais do usuário são validadas (usuario e senha) e as autorizações do usuário são carregadas
passo 4:
Destruir a tela de login - usando dispose() por exemplo.
passo 5:
Criar a janela principal da aplicação usando as autorizações do usuário para habilitar os menus e tal.
Como fazemos isso depende muito do seu estilo. Eu normalmente faço uma classe chamada ApplicationContext que contém um apontamento para coisas importantes como login e a janela principal. Ela controla o fluxo da aplicação (qual tela está aberta e qual tela será a próxima a abrir). Uso um Singleton para garantir que apenas um contexto exista.
Você poderia começar com algo do tipo:
public class ApplicationContext {
public static final ApplicationContext instance;
// outras variáveis de controle
private Usuario usuarioLogado = null;
public ApplicationContext() {
if (instance != null) throw new IllegalStateException("Apenas um contexto pode existir");
instance = this;
}
// usa o método estático para acessar o contexto da aplicação de qualquer lugar
public static ApplicationContexto getInstance() {
return instance;
}
// Aqui começa sua aplicação
public void init() {
// cria e mostra o form de login
}
// getters e setters aqui
}
Depois na mesma classe ou em outra você cria a instância do contexto da aplicação e inicializa sua aplicação:
public class Main {
public static void main (String [] args) {
new ApplicationContext().init();
}
}
A partir daí você vai ter acesso de qualquer lugar ao contexto da aplicação através do método getInstance:
// dentro da janela de login
// action do botão login
public void actionPerformed(ActionEvent e) {
// pega o login e senha do usuário e valida
// carrega as autorizações dele
// seta o usuário logado no contexto da aplicação
ApplicationContext contexto = ApplicationContext.getInstance();
contexto.setUsuario(usuarioLogado);
contexto.abreJanelaPrincipal();
}
Eu normalmente trabalho desta forma. Coloquei bastante código aqui então se não entender alguma coisa ou ficar confuso, me avise.
[code]// Aqui começa sua aplicação
public void init() {
// cria e mostra o form de login
}
// getters e setters aqui
} [/code]
isto é tipo um menu,eu crio as jlabels,jtextfield… todos os itens da tela,é?
esta classe ApplicationContext tipo ela será a tela de login ou eu uso um objeto dela para logar?
:oops: brigada
Não… a lógica de login e criar tela fica na classe que representa a tela mesmo.
Normalmente temos uma classe que estende JFrame ou algo do tipo onde a tela é inicializada. Isso para cada tela.
Então neste método teria algo do tipo:
public void init() { // melhor mudar este método para login()
LoginFrame telaDeLogin = new LoginFrame(); // cria a janela e inicializa os componentes
telaDeLogin.setVisible(true); // mostra a janela e aguarda a ação do usuário
}
Se a tela de login tiver dois botões, login e cancelar, o cancelar irá só destruir a tela de login e sair do aplicativo. O login irá fazer o que eu tinha falado antes.
Não aparece porque o Container é só um lugar onde se coloca componentes. Não é uma janela. Para criar uma janela você precisa de um JFrame.
Tenta separar as coisas… colocar tudo que é de interface gráfica (botões e tal) na classe aonde eles pertecem. Tipo… TelaDeLogin estende JFrame e contém os botões e os campos de usuário e senha. A action de login ficaria lá dentro.
Os pontos que falei aqui foram só orientação mesmo. Organização de código, separação de responsabilidades, desacoplamento e encapsulamento… essas coisas básicas. Mas se você está satisfeita com o código assim, então ótimo!
Algumas observações:
1 - Esse código compila? Se ele compila então sua classe Usuario implementa um ActionListener, é isso mesmo? Na linha 65 está adicionando o usuário logado como ActionListener mas na hora que passar por ali Usuario ainda é null… toma cuidado com isso.
2 - Na linha 78 está fazendo um if e colocando um ponto e vírgula no final… cuidado que isso implica que você está ignorando completamente o if. As expressões abaixo dele serão sempre executadas! Veja o seguinte exemplo:
if (false);
System.out.println("No");
System.out.println("Yes");
Apesar da condição ser false dentro do if, ela imprime “No” e “Yes”.
3 - Você está usando um array de tamanho fixo para armazenar uma quantidade variável de autorizações do usuário. Isso implica que você vai ter valores nulos dentro do array e terá que controlar o tamanho na mão (o que está sendo feito com a variável q). Se você usasse um ArrayList, resolveria o seu problema de forma mais fácil já que ele fará esse controle para você automaticamente. Poderia fazer o seguinte:
// declarar v como um array list
ArrayList<String> v = new ArrayList<String>();
// dentro do loop, só adiciona os valores:
while (resultado.next()) {
v.add(resultado.getString(1)); // se o dado armazenado no banco é um varchar ou um char pode usar o getString ao invés do getObject
}
// no for
for (int i = 0; i < v.size(); i++) {
String nomeAutorizacao = v.get(i);
// faz as verificações aqui
}
4 - Não entendi a linha 166… está passando um Dimension vazio para o tamanho máximo da janela. Talvez seja esse seu problema. A janela deve estar abrindo mas deve estar ficando bem pequena e talvez você não esteja a vendo. Remova esta linha, talvez ajude.
troquei o vetor de string pelo arraylist como tu disseste e tambem tirei a linha com o new Dimension e troquei o ; pelas {} após o if mas sobre o primeiro item q tu falou do usuario [quote]1 - Esse código compila? Se ele compila então sua classe Usuario implementa um ActionListener, é isso mesmo? Na linha 65 está adicionando o usuário logado como ActionListener mas na hora que passar por ali Usuario ainda é null… toma cuidado com isso. [/quote]
o codigo compila mas o menu não é exibido como eu faço para o usuario não ser null? :oops:
Visola muito obrigado pela ajuda assim q o programar rodar direitinho eu te mando um print! :lol:
[quote=paty_trind]o codigo compila mas o menu não é exibido como eu faço para o usuario não ser null? :oops:
Visola muito obrigado pela ajuda assim q o programar rodar direitinho eu te mando um print! :lol: [/quote]
No seu código ele nunca deixa de ser null. Você precisa, depois de carregar o usuario e senha e as autorizações, criar uma nova instância da classe e passá-lo para o setter:
// Antes do while (resultado.next()) {
Usuario usuario = new Usuario();
usuario.setLogin(h);
while (resultado.next()) {
String autorizacao = resultado.getString(1);
v.add(autorizacao);
usuario.addAutorizacao(autorizacao); // coloca as autorizacoes dentro do usuario se preciso
}
// chama o setter
setUsuarioLogado(usuario);
Não entendi porque o seu usuário implementa ActionListener e porque você registra ele no botão de login. Tem que ver para que você precisa do usuário e depois de passá-lo no setter, faça a ação que deseja, dentro da ação de login mesmo.
ah este metodo usuario.setLogin(h); eu devo cria-lo?
eu preciso do usuario so para saber o q vai ser habilitado e desabilitado no menu,e sobre o actionlistener eu coloquei ali sem querer é que tipo eu tentei fazer b.addActionListener(this);e dava erro pq a classe não implemnta um actionlistenermas agora eu coloquei b.addActionListener(null);
Visola meu menu ainda não aparece tipo eu qria q acontecesse o seguinte o usuario digitasse o login e senha e ao clicar em entrar akela tela d login sumisse e aparecesse o menu cm os itens habilitados e desabilitados
obg
Visola
descobri pq o menu não tava abrindo,tipo na ação do botao b tava if( e.getSource==b5) troquei e agora o menu aparece mas os itens não são desabilitados !=[
no banco eu criei uma tabela de usuario com os dados id,nome e senha para salvar o login e senha do usuario,criei tambem a tabela autorizacao com os itens id,nome(nome do item do menu/serão exibidos em forma de checkbox na tela de cadastro de usuario) e menu_nome(nome do menu) e também a tabela autorizacao_usuario com id,nome(do usuario)e Id_autorizacao,Tipo nesta ultima tabela eu salvo os itens q o usuario marcou na tela ao se cadastrar pela primeira vez
obg
Acho que o seu problema está no SQL. Você está selecionando o ID da autorização e comparando com o nome no menu. Não é este o problema? Por questão de segurança, não seria melhor deixar todos desabilitados e habilitar de acordo com a autorização que ele tem?
acho q talvez seja este o problema mesmo!!
acho q é melhor fazer deste jeito deixar tudo desabilitado e habilitar conforme as autorizações relacionadas akele usuario vou arrumar e depois posto
mtooo obg!!
=]
bah eu não sei onde esta o erro mas fiz o q tu disseste tipo desabiliteitodos os itens do menu e tentei habilitar conforme as autorizações dakele usuario q esta se logando mas nenhum item foi habilitado! :shock:
fiz assim no botão entrar q usuario deve clicar apos escrever seu login e senha
try{
Menu m=new Menu();//desabilito os itens do menu
m.pesq.setEnabled(false);m.notada.setEnabled(false);m.cadbanco.setEnabled(false);m.nota.setEnabled(false);
m.pesqfina.setEnabled(false);m.npo.setEnabled(false);m.cad.setEnabled(false);m.io_estados.setEnabled(false);
m.cadTurmas.setEnabled(false);m.cadprof.setEnabled(false);m.visu.setEnabled(false);m.estat.setEnabled(false);
m.estat2.setEnabled(false);m.cancel1.setEnabled(false);
...
//faço a 1 pesquisa para ver se o usuario existe no banco
//faço a 2 pesquisa para pegar as autorizações relativas a este usuario adiciono o resultado no arraylist
//percorro o arraylist e vejo se o item do menu tem o mesmo nome da autorização habilita
if((m.pesq.equals(v.get(i))))
{
m.pesq.setEnabled(true);
}
mas não o q estou fazendo errado pois os itens não estão sendo habilitados =[
obg pela ajuda
Acho que o que vocẽ está fazendo errado é que está comparando um menu com uma string. Pelo que entendi do seu código, quando faz: menu.pesq, pesq é um JMenuItem dentro de Menu, é isso mesmo?
Está usando o método equals para comparar o menu com a string que é o ID da autorização que pegou do banco no select. Uma string nunca pode ser igual a um JMenuItem.