Como Desabilitar um Botão em Java, de outra Tela?

Pessoal não sei que estou errando, quero desabilitar o botão excluir, de acordo com o perfil, tenho dois perfil, o Administrador e Usuário, no AD, libera todas as funcionalidades, já no usuário não, dai quero desabilitar o botão excluir do cadastro, mas não funciona.

 } if (perfil.equals("usuario")) {
                    TelaPrincipal principal = new TelaPrincipal();
                    principal.setVisible(true);
                    TelaPrincipal.txtCamp.setEnabled(true);
                    TelaPrincipal.txtOrdemCamp.setEnabled(true);
                    TelaPrincipal.menuCad.setEnabled(false);
                    TelaPrincipal.atendente.setText(rs.getString(2));
                    TelaPrincipal.atendente.setForeground(Color.BLUE);
                    
                    // aqui faço a logica pra desabilitar o botão,pois é de outra tela
                    TelaCampista campista = new TelaCampista();
                    campista.setVisible(true);
                    TelaCampista.Excluir.setEnabled(false);

vc pode fazer um botão static ou fazer esse novo jframe ter parent com o jframe principal

1 curtida

como assim parent?

Nossa, agora que li a sua questão, desculpa.

Passa um verificador, aí se for “usuario” o botão fica disable.

tipo:

 new TelaCampista("usuario").setVisible(true);

Frame 1

public class TelaCampista extends javax.swing.JFrame {
    public TelaCampista(String permissao) {
        initComponents();

        if(permissao.equals("usuario")){
           botao.setEnabled(false);
        }
    }
}
2 curtidas

Ja tenho o verificador, com nome de Perfil, se eu colocar no construtor ele da erro

String perfil = rs.getString(9);
                //System.out.println(perfil);
                this.setVisible(false);
                if (perfil.equals("admin")) {
                   
                    TelaPrincipal principal = new TelaPrincipal();
                    principal.setVisible(true);
                    TelaPrincipal.RelaA.setEnabled(true);
                    TelaPrincipal.menuCad.setEnabled(true);
                    TelaPrincipal.txtCamp.setEnabled(true);
                    TelaPrincipal.txtOrdemCamp.setEnabled(true);
                    TelaPrincipal.RelatorioAcamp.setEnabled(true);
                    TelaPrincipal.atendente.setText(rs.getString(2));
                    TelaPrincipal.atendente.setForeground(Color.RED);
               
                
                } if (perfil.equals("usuario")) {
                    TelaPrincipal principal = new TelaPrincipal();
                    principal.setVisible(true);
                    TelaPrincipal.txtCamp.setEnabled(true);
                    TelaPrincipal.txtOrdemCamp.setEnabled(true);
                    TelaPrincipal.menuCad.setEnabled(false);
                    TelaPrincipal.atendente.setText(rs.getString(2));
                    TelaPrincipal.atendente.setForeground(Color.BLUE);

Botões pertencem à instância da janela criada, não faz sentido torná-los static

Depois que eu li a questão de fato kkkkk

qual erro?

Ele não desabilita sabe, fica sempre visível, não importa o perfil

mas vc disse que da erro

pensei dessa maneira dentro do evento do Botão excluir, mas não deu certo

String perfil;
        try {
            perfil = rs.getString(9);
             if (perfil.equals("usuario")) {
                 Excluir.setEnabled(false);
                 
                 
        }
        } catch (SQLException ex) {
            Logger.getLogger(TelaCampista.class.getName()).log(Level.SEVERE, null, ex);
        }

Você criou a instância “campista”, mas está tentando desabilitar o botão através de “TelaCampista”.

Talvez você devesse tentar:

campista.Excluir.setEnabled(false)

Ou…

Colocar todo esse processo dentro da mesma thread.

1 curtida

Sim eu fiz assim, mas não da certo.

TelaCampista campista = new TelaCampista();
                   campista.setEnabled(true);
                   campista.Excluir.setEnabled(false);

Tente colocar todo o processo dentro da mesma thread.

como assim?

Da erro porque?

Não sou muito bom em swing, pois programo em JavaFX, mas creio que, quando se trata de uma tela fazer alterações em outra tela, os códigos que as controlam precisam fazer parte do mesmo processo (mesma thread).

No seu caso, cada tela aberta está fazendo parte de seu próprio processo. Não sei como isso ocorre no swing, mas, no JavaFX, uma tela só consegue alterar outra tela se seus códigos forem colocados dentro de uma mesma thread (mesmo processo).

Se eles NÃO estiverem dentro da mesma thread, só uma tela de cada vez poderá ser alterada.

Quando você colocar tudo em uma mesma thread, elas poderão ser alteradas, ao mesmo tempo.

Dê uma olhada nesse link e em outro links (existem muitos) que falem sobre threads, em Java:

https://www.devmedia.com.br/trabalhando-com-threads-em-java/28780

Se conseguir baixar o livro JAVA - COMO PROGRAMAR (DEITEL), existe um capítulo inteiro sobre threads.

1 curtida

Mas com certeza vou olhar sim

Não tem nada a ver.

Imagino que das duas uma:

Ou está desabilitando a instância errada.

Ou não está sabendo passar o parâmetro para o construtor da tela.

Ele também poderia muito bem criar um método para desabilitar os botões que quer.

Ou ter um objeto modelo acessível pra todas as telas e obter o perfil a partir desse objeto.

Opções não faltam.

De repente se postar o código das classes envolvidas, fica mais fácil mostrar a solução

É verdade.

Essa é uma opção que você poderia tentar.

Criar um método público estático, no mesmo código onde o botão se encontra. Dessa forma, outras janelas acessarão esse método e habilitarão/desabilitarão o botão.

Assim como falei, não sou muito bom em swing. Porém sei que no JavaFX, isso não funcionaria.

Estático não!

1 curtida