У меня есть a Composite
то, что я хочу смочь позволить/запретить программно. Control.setEnabled(boolean enabled)
метод хорошо работает, но он не дает визуальной информации, что виджет (виджеты) отключен.
То, что я хотел бы сделать, должно иметь нерабочее состояние, среднее, что виджеты отображаются серым. Прямо сейчас они просто вводят странное состояние, где пользователь не может нажать или выполнить любое действие с ними.
Составной элемент - это контейнерный элемент управления, который содержит другие элементы управления с использованием макета - на самом деле вы не можете увидеть составной элемент, вы можете увидеть только элементы управления, которые он удерживает. Чтобы отключить и визуально увидеть, что затем отключено, вам придется вызвать setEnabled (false)
для всех дочерних элементов, предполагая, что они тоже не являются контейнерами. По сути, нужно включить / отключить листовые виджеты, и вы увидите визуальную индикацию.
Причина, по которой вы не можете ничего сделать с виджетами при отключении Composite, заключается в том, что Composite поглощает все события. Хотя дочерние виджеты не получают пересылки событий, они ничего не знают о состоянии своих родительских виджетов, поэтому они не отображаются серым цветом.
Проблема действительно заключалась в том, что я отключал композит, а не элементы управления внутри него. В итоге я сделал что-то вроде этого:
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);
}
}
Другими словами, вам нужно написать код вроде этого, учитывая Composite c
:
for (Control child : c.getChildren())
child.setEnabled(false);