Ajuda para habilitar e desabilitar itens de menu[resolvido]

ola,
tenho um programa com vários itens no seu menu e tenho uma tela de cadastro e login separadamente,gostaria de saber como eu faço para que cada login habilite alguns itens do menu e desabilite outros conforme o q foi cadastrado em cada login.Isto é possivel?
Segue um print da minha classe de cadastrar e efetuar login
obg


eu acho q eu deveria comparar o nome do item q for marcado na checkbox na tela de login com o respectivo item de menu,mas cmo eu posso fazer esta comparação?
mt obg

Normalmente associamos ao usuário algum tipo de autorização que fica salva no banco. Por exemplo, se ele vai ter acesso ao menu “Opções”, você teria no banco uma autorização chamada “Opções”. E quando salvasse o usuário, cada checkbox na sua tela de cadastro de usuário, estaria associada a uma autorização. Ao salvar o cadastro do usuário, associaria a ele as autorizações que ele tem. Quando ele logar no sistema, carrega o usuário e suas autorizações e monta o menu a partir das autorizações que ele tem - comparando o título da autorização com o texto do menu, talvez?

Deu para entender mais ou menos?

visola é isto mesmo que preciso fazer!!mas como eu faço estas autorizações?e como eu faço esta comparação tipo do texto da checkbox com o nome do item do menu?
bah mto obg

A autorização pode ser uma classe simples, algo do tipo:

public class Autorizacao {
   private int id;
   private String nome;

   public Autorizacao (int id, String nome) {
      this.id = id;
      this.nome = nome;
   }

   // getters e setters
}

Como você salva e carrega isso no banco aí depende muito da arquitetura da sua aplicação.

Para comparar a autorização com o checkbox também depende, mas você precisa verificar se o checkbox está selecionado, achar a autorização associada a ele e adicionar a autorização no perfil do usuário. Seria algo como o seguinte:

for (JCheckBox chkBox : {lista de checkboxes}) {
   if (chkBox.isSelected()) {
      for (Autorizacao autorizacao : {lista de autorizacoes}) {
         if (chkBox.getText().equals(autorizacao.getNome()) {
            usuario.addAutorizacao(autorizacao); // o usuário possui uma lista de autorizações
            break; // não precisa continuar procurando, já achou a autorização
         }
      }
   }
}

O que está aqui ainda é muito superficial porque o que você está tentando fazer pode ser feito de várias formas diferentes mas espero ter ajudado um pouco.

visola
tu estas me ajudando um monte!
esta classe autorização serve para a pesquisa dos itens do menu para depois na tela de login eu verificar se o ck selecionado cmo tu disseste for igual a esta autorização habilitar tais itens…
é mais ou menos isto? :oops:
obg

Acho que sim. Não entendi direito o que quis dizer. :smiley:
Mas esta classe poderia representar todas as autorizações do seu sistema, todos os menus que existem.
Você poderia até usá-la para gerar os checkboxes, carregando todas as autorizações do banco e criando o JCheckBox com o nome da autorização.

Agora, uma coisa que não está ficando clara para mim é… a tela que tem os checkboxes é a tela de cadastro de usuário ou a tela de login?

na verdade antes eu tinha pensado em fazer as duas telas em uma só :oops: mas não iria dar muito certo bem os checkboxes estão na tela de cadastro do usuario dai eu vou criar uma tela simples so cm login ,senha e ok para acessar o programa

Entendi. Então vamos lá:

O seu usário deve ter um perfil ao qual estão associadas todas as autorizações que ele tem. Isso pode ser carregado junto com o usuário, no login por exemplo. E então, os botões e menus podem ser habilitados/desabilitados a partir da lista de autorizações do usuário.

Na tela de cadastro de usuário você pode gerar os checkboxes a partir da lista de autorizações cadastradas no banco. Se estiver editando um usuário que já existe, usa a lista de autorizações dele para selecionar os checkboxes que representam as autorizações que ele tem. Ao salvar o usuário na tela de cadastro, faz o que eu tinha falado, verifica quis checkboxes estão selecionadas e adiciona as autorizações específicas ao usuário.

criei duas tabelas no banco uma de autorizaçoes com id,nome(item do menu),menu_nome(nome do menu) e outra tabela usuario com id,nome e senha gora eu sei que preciso relacionar os checkboxes marcados com os itens da tabela autorização e acho que eu preciso criar um campo na tabela usuario ou em outra tabela com os itens q serao habilitados,certo?mais ou menos?
obg

Isso mesmo! Está correto.

Mas como o relacionamento entre autorizações e usuários é muitos (usuário) para muitos (autorizações), já que uma mesma autorização pode pertencer a mais de um usuário, você vai ter que criar uma tabela de relacionamento que contém o id do usuário e o da autorização. Então não vai precisar de nenhum campo na tabela de usuários para dizer quais autorizações ele tem.

Assim, quando um usuário tiver uma autorização, na tabela de relacionamento (Usuario_Autorizacao), vai ter um registro com o id do usuário e o id da autorização.

Espero que dê para entender.

tah construi as tabelas desta forma so q ao inves de pegar o id eu estou pegando o nome do usuario e o nome da autorização,é que uso o banco mysqlfront e ainda não descobri como gerar as pk e fks aki se não seria mais facil :oops:
mas agora q tenho a tela de cadastro,outro para login omo posso fazer para comparar as checkboxes om os itens do menu principal para habilitar e desabilitar itens conforme o usuario e suas autorizações como posso fazer esta verificação usando banco(autorizaçoes)e menu(itens)?
obrigada pela ajuda
=]

para abrir o menu com o item desabilitado criei um botão na tela de login que abre o menu mas que antes faz uma pesquisa no banco e verifica qual quais itens estão habilitados mas ocorreu um problema no meu codigo pois são abertas varias janelas ao mesmo tempo e nenhuma tem o item desabilitado :cry:

[code]if(t0.getText()!=null && t1.getText()!=null)
{
//pesquiso no banco as autorizações relativas ao usuario e habilito e desabilito itens
try{
resultado=comando.executeQuery(“select nome,senha from usuario where nome=’”+t0.getText()+"’");
if(resultado.next());
resultado=comando.executeQuery(“select Id_autorizacao from autorizacao_usuario where nome=’”+t0.getText()+"’");
while(resultado.next())
{
v[q]=resultado.getObject(1).toString();
q++;
}

						for(int i=0;i<v.length;i++)
						{
							if(!(new Menu().pesq.equals(v[i])))
							{
								new Menu().pesq.setEnabled(false);
							}
						}
					}
					catch(SQLException ew)
					{
						ew.printStackTrace();
					}
					
					java.awt.EventQueue.invokeLater (new Runnable () {   
					public void run () {   
						new Menu().setVisible (true);   
					}   
				});
				}[/code]

o que estou fazendo errado?é por causa do for?
na verdade em algumas telas o item fica desabilitado e em outras não mas de qualquer forma ele gera umas 20 ou 30 tela :shock: s
obrigada

Provavelmente porque está trabalhando com 3 instâncias separadas do Menu no seu código. Em cada uma das linhas que você se refere ao menu cria um novo ao invés de usar um que esteja sendo usado para criar a janela. Você deveria ter apenas uma instância ao invés de faer “new Menu()” toda vez.

Guarde este menu numa variável privada interna na classe e então use sempre o mesmo, senão vai acontecer isso que você está vendo, vai pesquisar a autorização em um, desabilitar em outro e mostrar outro.

Visola
obrigada deste jeito funcionou direitinho a unica coisa que aconteceu é que o menu ja abre direto tipo eu deveria escrever o login,senha e clicar em acessar para que ele aparecesse mas quando eu abro a tela de login o menu abre junto :oops: ,como posso resolver isto tipo eu coloco ele invisivel e so o torno visivel após clicar o botão?
obrigada

Tem que colocar uma tela antes de tudo que representa o login. E se o usuário e senha estiver correto, fecha esta tela e abre outra com os menus habilitados ou não de acordo com as autorizações do usuário.

bem estou tentando fazer isto mas não está dando muito certo :oops: é que as telas estão sendo abertas ao mesmo tempo tipo meu codigo é este (do botão que abre a tela do menu,ou que deveria abrir)

//primeiro vejo se o login e senha estão cadastrados no banco resultado=comando.executeQuery("select nome,senha from usuario where nome='"+t0.getText()+"'"); if(resultado.next()); //depois vejo quais as autorizações relacionadas a este usuario e jogo em um vetor resultado=comando.executeQuery("select Id_autorizacao from autorizacao_usuario where nome='"+t0.getText()+"'"); while(resultado.next()) { v[q]=resultado.getObject(1).toString(); q++; }
depois vejo quais destas autorizações são iguais as do menu,esta minha parte acho que esta errada porque ele so ta desabilitando um item quando pelo teste que estou fazendo deveria deixar apenas 2 itens habilitados
acho que ele ta comparando o nome do menu e não seus itens

for(int i=0;i<v.length;i++) { if(!(m.pesq.equals(v[i]))) { m.pesq.setEnabled(false); } if(!(m.notada.equals(v[i]))) { m.notada.setEnabled(false); } ...
só q tah desabilitando todos os itens!!!

obrigada

Os códigos deveriam estar separados. A primeira parte que valida o usuário e senha deveria estar numa tela.

A parte que gera o menu deveria estar na outra tela. Por isso está acontecendo tudo junto.

Sobre desabilitar todos os menus, acho que o problema está no seu Menu, porque apesar de usar o “i” para percorrer todas as autorizações, não está percorrendo todos os menus. Está trabalhando sempre sobre o mesmo… pesq ou notada? :slight_smile: setEnabled está habilitando um ou todos? Não entendi direito este código.

ele está desabilitando todos :oops:
ta e tipo como dividir este codigo em telas

tipo eu tenho a tela de login e a de cadastro tipo a de login deveria abrir o menu então eu faço o codigo em metodos separados na tela de login ou eu desabilito e habilito na tela de menus?
ou crio 2 botões um para checar as autorizações e outro para percorrer os itens e tal?
obrigada

a parte das telas abrirem juntas consegui resolver fiz assim na tela de login troquei isto private Menu m=new Menu(); por Menu m=new Menu(); dentro do try do botão de acesso mas ainda esta sendo tudo desabilitado! :shock: