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

20 respostas
java
Henrique_Menna

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);

20 Respostas

rodriguesabner

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

Henrique_Menna

como assim parent?

rodriguesabner

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);
        }
    }
}
Henrique_Menna

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);
staroski

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

rodriguesabner

Depois que eu li a questão de fato kkkkk

qual erro?

Henrique_Menna

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

rodriguesabner

mas vc disse que da erro

Henrique_Menna

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);
        }
AlexandreCamelo

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.

Henrique_Menna

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

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

Tente colocar todo o processo dentro da mesma thread.

Henrique_Menna

como assim?

staroski

Da erro porque?

AlexandreCamelo

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.

Henrique_Menna

Mas com certeza vou olhar sim

staroski

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

AlexandreCamelo

É 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.

staroski

Estático não!

vmeazevedo

Eu ia sugerir a sua resposta tbm… hahaha
Acho mais prático.

Criado 18 de julho de 2020
Ultima resposta 19 de jul. de 2020
Respostas 20
Participantes 5