Ajuda para habilitar e desabilitar itens de menu[resolvido]

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.

tipo nesta parte aki

[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

tipo peguei o seu exemplo e modifiquei algumas coisas e dai esta classe ficou assim

[code]import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;

public class ApplicationContext {
public static ApplicationContext instance;

   // outras variáveis de controle  
   private Usuario usuarioLogado = null;  
   JLabel l0,l1;
	JFormattedTextField t0;

	JPasswordField t1;
	JButton b,b1,b3,b4,b5,b6,b7;

	Connection conexao;
	Statement comando;
	ResultSet resultado;

	Container tela=new Container();
	String v[]=new String[12];
	int q=0;
	String h=null,h1=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 ApplicationContext getInstance() {  
      return instance;  
   }  
     
   // Aqui começa sua aplicação  
   public void init() {  
		tela.setLayout(new FlowLayout());    

		l0=new JLabel("Login");
		l1=new JLabel("Senha");

		t0=new JFormattedTextField();
		t1=new JPasswordField();t1.setEchoChar('*');

		b=new JButton("Entrar");
		

		l0.setBounds (20, 30, 120, 25); t0.setBounds (175, 30,300, 25); 
		l1.setBounds (20, 60, 120, 25); t1.setBounds (175, 60,300, 25); 


		b.setBounds (175, 180, 120, 25);
		

		tela.add(l0);tela.add(l1);
		tela.add(t0);tela.add(t1);tela.add(b);
		

		try {
			conexao = conecta.conectabanco();
			comando = conexao.createStatement();
		}
		catch(Exception e) {
			JOptionPane.showMessageDialog(null, "Erro na conexÄo do banco");
		}

		//b.addActionListener((ActionListener) tela);
		
		b.addActionListener (new ActionListener (){   
			public void actionPerformed (ActionEvent e){
				if(b5==e.getSource())
				{
					if(t0.getText()!=null && t1.getText()!=null)
					{
						try{
							System.out.println("select nome,senha from usuario  where nome='"+t0.getText()+"'");
							resultado=comando.executeQuery("select nome,senha from usuario  where nome='"+t0.getText()+"'");
							if(resultado.next());
							h=resultado.getObject(1).toString();
							h1=resultado.getObject(2).toString();
							
							Menu m=new Menu();
							System.out.println("select Id_autorizacao from autorizacao_usuario  where nome='"+h+"'");
							resultado=comando.executeQuery("select Id_autorizacao from autorizacao_usuario  where nome='"+h+"'");
							while(resultado.next())
							{
								v[q]=resultado.getObject(1).toString();
								q++;
							}
							
						}
						catch(SQLException ew)
						{
							JOptionPane.showMessageDialog(null,"Este usuario não foi cadastrado!");
							ew.printStackTrace();
						}
						
					}
				}
			}});
		tela.setSize(650,300);
		tela.setVisible(true);
		
		
   }

public void setUsuarioLogado(Usuario usuarioLogado) {
	this.usuarioLogado = usuarioLogado;
}

public Usuario getUsuarioLogado() {
	return usuarioLogado;
}  
  
public void actionPerformed(ActionEvent e) {  
	  
	   ApplicationContext contexto = ApplicationContext.getInstance();  
	   contexto.setUsuarioLogado(usuarioLogado);  
	  
	   contexto.abreJanelaPrincipal();  
	}  

 private void abreJanelaPrincipal() {
	 java.awt.EventQueue.invokeLater (new Runnable () {   
			public void run () {   
				new Menu().setVisible (true);   
			}   
		}); 
	
}

public static void main (String [] args) {  
      new ApplicationContext().init();  
   }  
}  

[/code]
só que quando eu tento rodar ela não aparece nada :oops:

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.

Visola
fiz o q tu disseste agora e a tela de login apareceu :smiley: mas tipo além disto eu tenho q mudar mais alguma coisa no codigo?
:oops: bg

Não tem… se está funcionando não tem.

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! :smiley:

Visola,
so tem um problema o botão de entrar não ta abrindo o menu principal :cry: sera q fiz algo errado d novo!o codigo da tela de login ficou assim

[code]public class ApplicationContext {
public static ApplicationContext instance;

// outras variáveis de controle  
private Usuario usuarioLogado = null;  
JLabel l0,l1;
JFormattedTextField t0;

JPasswordField t1;
JButton b,b1,b3,b4,b5,b6,b7;

Connection conexao;
Statement comando;
ResultSet resultado;

Container tela=new Container();
String v[]=new String[12];
int q=0;
String h=null,h1=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 ApplicationContext getInstance() {  
	return instance;  
}  

// Aqui começa sua aplicação  
public void init() {  

	JFrame telaDeLogin = new JFrame(); // cria a janela e inicializa os componentes  
	telaDeLogin.setVisible(true); 
	telaDeLogin.setLayout(null); 

	l0=new JLabel("Login");
	l1=new JLabel("Senha");

	t0=new JFormattedTextField();
	t1=new JPasswordField();t1.setEchoChar('*');

	b=new JButton("Entrar");

	l0.setBounds (20, 30, 120, 25); t0.setBounds (175, 30,300, 25); 
	l1.setBounds (20, 60, 120, 25); t1.setBounds (175, 60,300, 25); 


	b.setBounds (175, 120, 120, 25);


	telaDeLogin.add(l0);telaDeLogin.add(l1);
	telaDeLogin.add(t0);telaDeLogin.add(t1);telaDeLogin.add(b);


	try {
		conexao = conecta.conectabanco();
		comando = conexao.createStatement();
	}
	catch(Exception e) {
		JOptionPane.showMessageDialog(null, "Erro na conexÄo do banco");
	}

	b.addActionListener(this.getUsuarioLogado());

	b.addActionListener (new ActionListener (){   
		public void actionPerformed (ActionEvent e){
			if(b5==e.getSource())
			{
				if(t0.getText()!=null && t1.getText()!=null)
				{
					try{
						Menu m=new Menu();
						System.out.println("select nome,senha from usuario  where nome='"+t0.getText()+"'");
						resultado=comando.executeQuery("select nome,senha from usuario  where nome='"+t0.getText()+"'");
						if(resultado.next());
						h=resultado.getObject(1).toString();
						h1=resultado.getObject(2).toString();

						
						System.out.println("select Id_autorizacao from autorizacao_usuario  where nome='"+h+"'");
						resultado=comando.executeQuery("select Id_autorizacao from autorizacao_usuario  where nome='"+h+"'");
						while(resultado.next())
						{
							v[q]=resultado.getObject(1).toString();
							q++;
						}
						for(int i=0;i<v.length;i++)
						{
							//if(v[i]!=null)
							if(!(m.pesq.equals(v[i])))
							{
								m.pesq.setEnabled(false);	
							}
							if(!(m.notada.equals(v[i])))
							{
								m.notada.setEnabled(false);
							}
							if(!(m.cadbanco.equals(v[i])))
							{
								m.cadbanco.setEnabled(false);
							}
							if(!(m.nota.equals(v[i])))
							{
								m.nota.setEnabled(false);
							}
							if(!(m.pesqfina.equals(v[i])))
							{
								m.pesqfina.setEnabled(false);
							}
							if(!(m.npo.equals(v[i])))
							{
								m.npo.setEnabled(false);
							}
							if(!(m.cad.equals(v[i])))
							{
								m.cad.setEnabled(false);
							}
							if(!(m.io_estados.equals(v[i])))
							{
								m.io_estados.setEnabled(false);
							}
							if(!(m.cadTurmas.equals(v[i])))
							{
								m.cadTurmas.setEnabled(false);
							}
							if(!(m.cadprof.equals(v[i])))
							{
								m.cadprof.setEnabled(false);
							}
							if(!(m.visu.equals(v[i])))
							{
								m.visu.setEnabled(false);
							}
							if(!(m.estat.equals(v[i])))
							{
								m.estat.setEnabled(false);
							}
							if(!(m.estat2.equals(v[i])))
							{
								m.estat2.setEnabled(false);
							}
							if(!(m.cancel1.equals(v[i])))
							{
								m.cancel1.setEnabled(false);
							}
						
							System.out.println(v[i]);
							
							
						}

					}
					catch(SQLException ew)
					{
						JOptionPane.showMessageDialog(null,"Este usuario não foi cadastrado!");
						ew.printStackTrace();
					}

				}
			}
		}});
	telaDeLogin.setSize(650,300);
	tela.setVisible(true);
	tela.setMaximumSize(new Dimension());

}

public void setUsuarioLogado(Usuario usuarioLogado) {
	this.usuarioLogado = usuarioLogado;
}

public Usuario getUsuarioLogado() {
	return usuarioLogado;
}  

public void actionPerformed(ActionEvent e) {  

	ApplicationContext contexto = ApplicationContext.getInstance();  
	contexto.setUsuarioLogado(usuarioLogado);  

	contexto.abreJanelaPrincipal();  
}  

private void abreJanelaPrincipal() {
	java.awt.EventQueue.invokeLater (new Runnable () {   
		public void run () {   
			new Menu().setVisible (true);   
		}   
	}); 

}

public static void main (String [] args) {  
	new ApplicationContext().init();  
}  

}
[/code]
obg

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&lt;String&gt; v = new ArrayList&lt;String&gt;();

// 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 &lt; 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 !=[

Você tem algum dado no seu banco? Na tabela de autorizações?

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. :smiley:

ah tah!
é isto q estou fazendo errado mesmo mas então como faço para comparar a autorização com o texto do menu item? :oops:
obg