Codename One obtém e desativa todos os componentes e subcomponentes

Sep 21 2020

Tenho um aplicativo Android com vários contêineres e outros componentes, como botões e rótulos.

O aplicativo usa pop-ups para informar ao usuário na primeira execução sobre o uso do aplicativo e seus componentes.

Desejo desativar o formulário e / ou todos os componentes e subcomponentes internos, até que o usuário pressione o botão Fechar da caixa de diálogo pop-up.

Tentei usar form.setEnabled (false), mas não funcionou.

form.getComponentCount () 

também obtém apenas os containers e a barra de ferramentas e não o que está dentro dos containers, por isso é insuficiente.

Agora uso o seguinte código para desativar os componentes:

form.setScrollable (false); 

for (Component component : containerOne ) {
        component.setEnabled(false);
}

for (Component component : containerTwo ) {
        component.setEnabled(false);
}

for (Component component : containerThree ) {
        component.setEnabled(false);
}

buttonOne.setEnabled(false);
buttonTwo.setEnabled(false);

textFieldOne.setEnabled(false);
textFieldTwo.setEnabled(false); 

mas isso exige muito código, já que preciso habilitar os componentes mais tarde e também estou usando várias classes.

Existe uma maneira simples ou mais fácil de conseguir isso?

Respostas

2 stevehannah Sep 28 2020 at 19:02

Você pode usar o ComponentSelector para habilitar / desabilitar componentes em uma linha de código.

$("*", rootContainer).setEnabled(false)
  1. O $é um pseudônimo deComponentSelector.select()
  2. O "*" é um seletor (semelhante a um seletor CSS) que diz para combinar todos os componentes.
  3. O rootContaineré um Containerobjeto que serve como raiz para a seleção.
  4. setEnabled(false) conjuntos enabled = false em todos os componentes no conjunto encontrado.
1 ShaiAlmog Sep 21 2020 at 09:12

Uma vez que você usa uma caixa de diálogo, desde que ela não mostre nada no formulário, é clicável.

Se você quiser bloquear qualquer coisa, a desativação é problemática porque não é recursiva. Basta substituir o ponteiro pressionado / liberado Forme bloqueá-los condicionalmente. Eles não irão propagar o evento adiante e você pode obter o mesmo efeito sem a alteração do estilo problemático para desativado.

por exemplo:

class MyForm extends Form {
    private boolean blockFormEvents;
    // ...
   
    @Override
    public void pointerReleased(int x, int y) {
        if(blockFormEvents) return;
        super.pointerReleased(x, y);
    }
   
    @Override
    public void pointerReleased(int[] x, int[] y) {
        if(blockFormEvents) return;
        super.pointerReleased(x, y);
    }

    @Override
    public void pointerPressed(int x, int y) {
        if(blockFormEvents) return;
        super.pointerPressed(x, y);
    }
   
    @Override
    public void pointerPressed(int[] x, int[] y) {
        if(blockFormEvents) return;
        super.pointerPressed(x, y);
    }
}