Codename One 获取和禁用所有组件和子组件

Codename One get and disable all components and sub components

我有一个 Android 应用程序,其中包含多个容器和按钮和标签等其他组件。

该应用程序使用弹出窗口在第一个 运行 时通知用户有关该应用程序及其组件的使用情况。

我想禁用表单和/或里面的所有组件和子组件,直到用户按下弹出对话框的关闭按钮。

我试过使用 form.setEnabled (false),但没有用。

form.getComponentCount () 

也只获取容器和工具栏,没有获取容器里面的东西,所以不够。

现在我使用以下代码来禁用组件:

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

但这需要大量代码,因为我需要稍后启用这些组件,而且我还使用了几个 类。

我有一种简单的或更简单的方法来实现这一目标吗?

因为您使用对话框,只要它在表单中显示任何内容都是可点击的。

如果你想进一步阻止任何禁用是有问题的,因为它不是递归的。只需覆盖 Form 中的指针 pressed/released 并有条件地阻止它们。他们不会向前传播事件,您可以获得相同的效果,而无需将有问题的样式更改为禁用。

例如:

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

您可以在一行代码中使用 ComponentSelector 到 enable/disable 组件。

$("*", rootContainer).setEnabled(false)
  1. $ComponentSelector.select()
  2. 的别名
  3. “*”是一个选择器(类似于 CSS 选择器),表示匹配所有组件。
  4. rootContainer 是一个 Container 对象,用作选择的根。
  5. setEnabled(false) 在搜索结果中的所有组件上设置 enabled=false。