我有一个Composite我希望能够以编程方式启用/禁用.该Control.setEnabled(boolean enabled)方法工作正常,但它不提供窗口小部件被禁用的任何可视信息.
我想要做的是让残疾状态意味着小部件是灰色的.现在,他们只是进入一个奇怪的状态,用户无法点击或执行任何操作.
Fre*_*rik 12
问题确实是我禁用了复合而不是其中的控件.我最终做的是这样的:
public void recursiveSetEnabled(Control ctrl, boolean enabled) {
if (ctrl instanceof Composite) {
Composite comp = (Composite) ctrl;
for (Control c : comp.getChildren())
recursiveSetEnabled(c, enabled);
} else {
ctrl.setEnabled(enabled);
}
}
Run Code Online (Sandbox Code Playgroud)
and*_*nka 11
Composite是一个容器控件,它使用布局来保存其他控件 - 您无法真正看到复合,只能看到它所拥有的控件.要禁用并在视觉上看到然后禁用,您必须呼叫setEnabled(false)所有孩子,假设他们也不是容器.基本上,要启用/禁用叶子小部件,您将看到视觉指示.
在禁用Composite时,您无法对窗口小部件执行任何操作的原因是Composite正在吃掉所有事件.虽然子窗口小部件没有转发事件,但是他们对父母的状态一无所知,所以他们不会变灰.