Ocultar item menu com base no login, como proceder?

bom dia pessoal! criei um metodo de login com 2 tipos de acesso “Administrador e Funcionario” gostaria de saber como faço para quando a pessoa entrar com funcionario, ele não ver esses seguintes itens (jMenu2,jMenuItem12,jMenuItem13)

 if (LoginUsuario.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "O Campo Usuário está vazio");
        } else if (LoginSenha.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "O Campo Senha está vazio");
        } else {
            String sql = "select id,username,password,division from Users Where (username =? and password =? and division =?)";
            //"select * from Employeeinfo where username=? and password=? and division=? and id=?";
            try {
                int count = 0;
                pst = conn.prepareStatement(sql);
                pst.setString(1, LoginUsuario.getText());
                pst.setString(2, LoginSenha.getText());
                pst.setString(3, txt_divisao.getSelectedItem().toString());
                rs = pst.executeQuery();
                {
                }
                while (rs.next()) {
                    int id = rs.getInt(1);
                    Emp.empId = id;
                    count = count + 1;
                }
                String access = (txt_divisao.getSelectedItem().toString());
                if (access == "Administrador") {
                    if (count == 1) {
                        JOptionPane.showMessageDialog(null, "Bem Vindo!");
                        Menu j = new Menu();
                        j.setVisible(true);
                        this.dispose();
                        java.util.Date currentDate = GregorianCalendar.getInstance().getTime();
                        DateFormat df = DateFormat.getDateInstance();
                        String dateString = df.format(currentDate);
                        java.util.Date d = new java.util.Date();
                        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
                        String timeString = sdf.format(d);
                        String value0 = timeString;
                        String values = dateString;
                        int value = Emp.empId;
                        String reg = "insert into Informacao (EMP_ID,DATA,STATUS) values ('" + value + "','" + value0 + " / " + values + "','Logged in')";
                        pst = conn.prepareStatement(reg);
                        pst.execute();
                        this.dispose();
                    } else if (count > 1) {
                        JOptionPane.showMessageDialog(null, "Duplicado, nome de usuário ou acesso à senha negado");
                    } else {
                        JOptionPane.showMessageDialog(null, "O nome de usuário e a senha não estão corretos");
                    }
                } else if (access == "Funcionario") {
                    if (count == 1) {
                        JOptionPane.showMessageDialog(null, "Bem Vindo!");
                        Menu j = new Menu();
                        j.setVisible(true);
                        java.util.Date currentDate = GregorianCalendar.getInstance().getTime();
                        DateFormat df = DateFormat.getDateInstance();
                        String dateString = df.format(currentDate);
                        java.util.Date d = new java.util.Date();
                        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
                        String timeString = sdf.format(d);
                        String value0 = timeString;
                        String values = dateString;
                        int value = Emp.empId;
                        String reg = "insert into Informacao (EMP_ID,DATA,STATUS) values ('" + value + "','" + value0 + " / " + values + "','Logged in')";
                        pst = conn.prepareStatement(reg);
                        pst.execute();
                        this.dispose();
                    } else {
                        JOptionPane.showMessageDialog(null, "O nome de usuário e a senha não estão corretos");
                    }
                }
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e);
            } finally {
                try {
                    rs.close();
                    pst.close();
                } catch (Exception e) {
                }
            }
        }

alaguem poderia me ajudar? obrigado!

jMenu2.setVisible(usuarioLogado.isAdmin());
// mesma coisa pros outros

oq seria esse usuariologado?
eu teria que ter um label informando?

Uma classe que representa o usuário. Como você faz para saber quem está logado?

eu não fiz isso, pensei que era só adicionar um if dentro da estrutura do login.

mas eu tenho um id que cadastro para cada usuário

Você precisa representar o usuário logado de alguma forma para poder saber se é admin ou não. Como é que você faz para saber se o usuário é admin ou não? Não precisa ser com uma classe, contanto que você de alguma forma descubra essa informação.

boolean usuarioLogadoEhAdmin = // descubra isso
jMenu2.setVisible(usuarioLogadoEhAdmin);

então… eu criei uma tabela com a seguinte estrutura (id “chave primaria com auto incremente”, password, ursername, division e emp_id )

se estiver escrito Adiministrado na division é pq é do tipo admin

Então, quando você faz o login, você tem que buscar o usuário no banco de dados. Pegue essas informações e guarde para saber mais tarde se o usuário é admin ou não.

esqueci de postar a estrutura do login, segue ela pra você pode me ajudar

 if (LoginUsuario.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "O Campo Usuário está vazio");
        } else if (LoginSenha.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "O Campo Senha está vazio");
        } else {
            String sql = "select id,username,password,division from Users Where (username =? and password =? and division =?)";
            //"select * from Employeeinfo where username=? and password=? and division=? and id=?";
            try {
                int count = 0;
                pst = conn.prepareStatement(sql);
                pst.setString(1, LoginUsuario.getText());
                pst.setString(2, LoginSenha.getText());
                pst.setString(3, txt_divisao.getSelectedItem().toString());
                rs = pst.executeQuery();
                {
                }
                while (rs.next()) {
                    int id = rs.getInt(1);
                    Emp.empId = id;
                    count = count + 1;
                }
                String access = (txt_divisao.getSelectedItem().toString());
                if (access == "Administrador") {
                    if (count == 1) {
                        JOptionPane.showMessageDialog(null, "Bem Vindo!");
                        Menu j = new Menu();
                        j.setVisible(true);
                        this.dispose();
                        java.util.Date currentDate = GregorianCalendar.getInstance().getTime();
                        DateFormat df = DateFormat.getDateInstance();
                        String dateString = df.format(currentDate);
                        java.util.Date d = new java.util.Date();
                        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
                        String timeString = sdf.format(d);
                        String value0 = timeString;
                        String values = dateString;
                        int value = Emp.empId;
                        String reg = "insert into Informacao (EMP_ID,DATA,STATUS) values ('" + value + "','" + value0 + " / " + values + "','Logged in')";
                        pst = conn.prepareStatement(reg);
                        pst.execute();
                        this.dispose();
                    } else if (count > 1) {
                        JOptionPane.showMessageDialog(null, "Duplicado, nome de usuário ou acesso à senha negado");
                    } else {
                        JOptionPane.showMessageDialog(null, "O nome de usuário e a senha não estão corretos");
                    }
                } else if (access == "Funcionario") {
                    if (count == 1) {
                        JOptionPane.showMessageDialog(null, "Bem Vindo!");
                        Menu j = new Menu();
                        j.setVisible(true);
                        java.util.Date currentDate = GregorianCalendar.getInstance().getTime();
                        DateFormat df = DateFormat.getDateInstance();
                        String dateString = df.format(currentDate);
                        java.util.Date d = new java.util.Date();
                        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
                        String timeString = sdf.format(d);
                        String value0 = timeString;
                        String values = dateString;
                        int value = Emp.empId;
                        String reg = "insert into Informacao (EMP_ID,DATA,STATUS) values ('" + value + "','" + value0 + " / " + values + "','Logged in')";
                        pst = conn.prepareStatement(reg);
                        pst.execute();
                        this.dispose();
                    } else {
                        JOptionPane.showMessageDialog(null, "O nome de usuário e a senha não estão corretos");
                    }
                }
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e);
            } finally {
                try {
                    rs.close();
                    pst.close();
                } catch (Exception e) {
                }
            }
        }

mais alguém poderia me ajudar?

Só uma dica: parece que você está misturando código de GUI (JOptionPane) com consulta ao BD na mesma classe e até no mesmo método! Se é isso, vc não deve ter muita experiência, é melhor que esse sistema não seja muito grande ou provavelmente vai chegar um ponto que você vai perder o controle dele.

Mas, sobre isso, vc conhece os princípios/conceitos abaixo?

  • Buscar o baixo Acoplamento no Sistema;
  • Divisão do Sistema em Camadas;
  • Princípios SOLID;
  • Débito Técnico.

Você está comparando Strings com “==”!!! Isto compara Objetos no heap, não é adequado para comparar Strings. faça assim: “if (access.equals("Administrador")) {

Dentro desse if (que só entra se o usuário for Admin) você pode colocar jMenu2.setVisible(true);

Bom dia Douglas, obrigado pela resposta.

eu fiz como vc disse, mas quando eu adiciono o jMenu2, ele diz q eu preciso criar um classe, mas eu não tenho.

Você disse que quer ocultar dos Funcionários os itens:

  • jMenu2
  • jMenuItem12
  • jMenuItem13

Eu não sei o que são eles, não estão no seu código, imagino que sejam da classe “Menu” que está no seu código, mas enfim…

Deve haver um jeito de controlar a exibição de cada um desses itens, com um método “setVisible(boolean isVisible)” ou algo do tipo; você terá que chamar esse método para ocultar esses itens quando entrar no if ("Funcionario".equals(access)) {, e terá que chamá-lo para exibir esses itens quando entrar no if ("Administrador".equals(access)) {.

Me diz uma coisa, o que é esse programa? Pra quem vc está fazendo ele (Faculdade, Empresa, Cliente particular, pra vc mesmo)?

Bom dia Douglas. Estou fazendo para uma pequena empresa da minha família. Estou cursando o curso de SI, mas ainda não completei… Ainda sou bem fraco nesse assunto e já estou tomando atitudes de fazer algum curso para aprender mais. as faculdades passam muito pouco e quando pedimos ajuda, eles não dão suporte.

Desculpa não saber muito, mas acho que você já passou por isso.

Os itens
jMenu2
jMenuItem12
jMenuItem13

são itens de um jframe chamado Menu.
apos efetuar o login, a pessoa cai no menu e nele eu tenho alguns itens como: cadastro das fichas, cadastro de novo login… onde não quero que um funcionário tenha acesso a ele.

por isso da necessidade de ocultar esses itens…

teria como você me dar uma dica mais detalhada se puder?

desde já agradeço!

Não acho que vc vai aprender qualidade de código e como fazer Arquiteturas de baixo acoplamento num curso ou faculdade, eles até podem falar do assunto mas acho difícil vc conseguir absorver nesse modelo de estudo.

O que eu recomendo fortemente é que você procure um estágio em uma empresa, lá eles vão ter preocupação com a qualidade do código e com a Arquitetura do Sistema, e vão se preocupar em fazer você aprender a fazer código de boa qualidade e boas Arquiteturas.

Se vc não conseguir um emprego, então te recomendo a procurar um projeto no GitHub para contribuir, é claro que vc vai ter que aprender a usar o Git primeiro (o que deve levar uma semana, talvez), mas é quase certo que você usará o Git em qualquer empresa ou em projetos pessoais, então não é nenhum desperdício aprendê-lo.
Se vc se envolver em um projeto OpenSource que tenha algumas pessoas mais experientes, eles vão avaliar o código que você cria antes de aceitá-lo no projeto, e se eles te derem dicas ou mostrarem os problemas, isso será uma forma de você aprender a fazer código e arquiteturas com qualidade.

Se você observar os códigos dos outros que são mais experientes, e refletir porque foi feito de um jeito e não de outro, questionando-se sobre as implicações (positivas e negativas) de fazer de um jeito ou de outro, então você começará a entrar no caminho certo, porque para projetar bem você precisa analisar quais serão as consequências (as boas e as más) de fazer de um jeito ou de outro, assim você faz escolhas conscientes sabendo para o que sua Arquitetura está bem preparada e para o que não está.

Em geral, procura-se fazer com que o Sistema seja “Flexível”, ou seja, que esteja bem preparado para sofrer mudanças (como acréscimo de funcionalidades); embora em alguns outros prefira-se melhor desempenho (muitas vezes é necessário escolher entre desempenho e flexibilidade).

Reflita sobre o seu código em relação as mudanças:

  • O que você precisará mudar nele se quiser que ele esteja disponível também em inglês? Será necessário editar um monte de Classes e códigos ou bastará adicionar em alguma pasta um simples arquivo de texto com todas as Strings que são mostradas ao usuário em inglês?
  • Quantas classes você teria que editar se quisesse alterar o Banco de Dados, seja usar outro BD, ou alterar a modelagem dele (Tabelas, Colunas, etc.)? Muitas classes ou apenas algumas poucas?
  • Se você quiser adicionar mais categorias de usuários além de “Administrador” e “Funcionario” no futuro, será necessário visitar uma ou mais classes para aumentar ifs/elses ou switchs a cada nova categoria de usuário? Se sim, o que ocorre se você esquecer algum deles? Não seria melhor poder adicionar uma nova categoria apenas criando uma nova classe e tudo já funcionaria certinho?
  • O Swing está sendo abandonado, o Java está seguindo para o JavaFX, o que acontecerá se, no futuro, você quiser mudar sua Interface Gráfica (GUI)? Será necessário abrir e editar um monte de classes ou seria simplesmente o caso de trocar um package que tem uma GUI por um pakage que tem a nova GUI (de modo que você possa criar a nova GUI sem ficar editando todo o código que já fez antes, criando-a independentemente, e depois trocando a GUI do Sistema em poucos minutos)?

Tenha em mente que abrir para editar uma classe que você terminou e já testou é bem ruim, pois ela pode estar funcionando agora, mas após ser editada pode parar de funcionar, ou pode fazer com que surjam bugs em outros lugares, aí você vai ter que ir a esses outros lugares editar, o que pode fazer aparecerem mais bugs, num efeito cascata. São situações onde você faz uma alteração e esta alteração exige mais alterações, que exigem mais alterações… E vc não sabe quando isso vai terminar (se é que vai!).

Em uma boa arquitetura, seu sistema cresce fácil, adicionando mais classes e arquivos, e, editando pouquíssimos arquivos/classes já criados (quanto menos melhor), assim diminui-se o trabalho e o “risco de quebrar o que estava funcionando”.

Em geral, não existe um “passo-a-passo” para fazer uma boa arquitetura (de modo que um programa poderia fazê-la pra você), a questão é que você precisa refletir sobre o que está fazendo, como o Sistema está ficando, e o que tanto será necessário editar nele se você precisar adicionar uma funcionalidade X ou alterar uma funcionalidade Y. Pense em várias formas diferentes de fazer e analise quais serão as consequências (as boas e as más), e escolha as formas que vão facilitar que seu sistema cresça do jeito que provavelmente irá crescer (facilite que as funcionalidades previsíveis de serem adicionadas possam ser facilmente adicionadas no futuro).

Uma frase comum é “Não é porque funciona que está certo”, e é assim porque o Sistema criado pode até funcionar mas terá vários problemas sérios que não teria se fosse feito do jeito “certo”.

Quanto ao sistema que você está criando, é melhor que ele seja pequeno, porque quando você adquirir mais experiência, e precisar alterar esse sistema (seja para corrigir bugs, ou adicionar/alterar funcionalidades) provavelmente vai preferir descartá-lo por completo e fazê-lo de novo do zero do que tentar mexer nele (mexer nele seria mais dispendioso do que fazer do zero!).

Se o sistema for se tornar muito grande e complexo, vc pode perder o controle sobre ele, como algo que eu ouvi:

Criar um Programa é como ter um filho, quando ele é pequeno você o entende e sabe lidar com ele, mas ele cresce rápido (torna-se adolescente), você não consegue mais entendê-lo, perde o controle e ele se vira contra você!

É uma brincadeira mas real, eu já passei por isso (não com filhos, mas com software rs) e muita gente também. Por isso que é tão importante buscar fazer certo, evitando problemas no futuro ao máximo, tanto com software quanto com filhos :slight_smile:

1 curtida

A Classe “Menu” estende JFrame (acho que um nome que faria um pouco mais de sentido seria TelaDeMenu, pois menu geralmente é algo que se insere numa tela), você quer ocultar esse “Menu” inteiro do funcionário (de modo que ele não veja essa tela) ou quer ocultar do funcionário apenas alguns itens desse Menu (de modo que essa tela apareça pra ele com alguns itens a menos)?

Entendido Douglas. vou seguir seus conselhos e muito obrigado pelas dicas.

tudo bem, vou renomear a tela menu. eu gostaria apenas de ocultar alguns itens de menu que contem dentro da TelaDeMenu do funcionário. Apenas o login administrador terá acesso a tudo e poderá cadastrar um novo usuário como eu disse logo a cima.

Você pode criar um método na classe TelaDeMenu que vai ocultar ou tornar visível esses itens, como “setVisibilidadeDosItensRestritos(boolean isVisiveis)”. Quando for um funcionário você chama esse método passando false, quando for um administrador vc chama passando true. Seria ainda melhor se você só precisasse chamar quando for administrador, e o comportamento Default seria não exibir.

Dentro desse método você deve colocar o código que exibe/oculta os itens em questão. Se o parâmetro receber true, deve exibir os itens, caso contrário deve ocultá-los.