Ответ 1
Панель должна иметь метод getComponents()
, который может использоваться в цикле для отключения подкомпонентов без явного их именования.
У меня есть несколько JComponent
на JPanel
, и я хочу отключить все эти компоненты, когда я нажимаю кнопку "Пуск".
В настоящее время я отключу все компоненты явно
component1.setEnabled(false);
:
:
Но есть ли в любом случае, что я могу сразу отключить все компоненты? Я попытался отключить JPanel
, к которому эти компоненты добавлены
panel.setEnabled(false);
но это не сработало.
Панель должна иметь метод getComponents()
, который может использоваться в цикле для отключения подкомпонентов без явного их именования.
Используйте JXLayer, LockableUI.
Disabled Panel поддерживает два подхода. Один, чтобы рекурсивно отключить компоненты, а другой - "нарисовать" панель с отключенным внешним видом.
Следующий метод использует рекурсию для достижения этой цели. Перейдите в любой Container
, и этот метод вернет массив Component
всех компонентов, не содержащих контейнеров, расположенных где угодно "внутри" Container
.
private Component[] getComponents(Component container) {
ArrayList<Component> list = null;
try {
list = new ArrayList<Component>(Arrays.asList(
((Container) container).getComponents()));
for (int index = 0; index < list.size(); index++) {
for (Component currentComponent : getComponents(list.get(index))) {
list.add(currentComponent);
}
}
} catch (ClassCastException e) {
list = new ArrayList<Component>();
}
return list.toArray(new Component[list.size()]);
}
}
Просто проведите по элементам возвращаемого массива и отключите компоненты.
for(Component component : getComponents(container)) {
component.setEnabled(false);
}
Следующий метод должен быть всем, что вам нужно добавить, вы можете вызвать его с помощью setEnableRec(panel, true)
или setEnableRec(panel, false)
:
private void setEnableRec(Component container, boolean enable){
container.setEnabled(enable);
try {
Component[] components= ((Container) container).getComponents();
for (int i = 0; i < components.length; i++) {
setEnableRec(components[i], enable);
}
} catch (ClassCastException e) {
}
}
Отключение должно происходить рекурсивно:
Queue<Component> queue = new LinkedList<>(Arrays.asList(container.getComponents()));
while(!queue.isEmpty()) {
Component head = queue.poll();
head.setEnabled(enable);
if(head instanceof Container) {
Container headCast = (Container) head;
queue.addAll(Arrays.asList(headCast.getComponents()));
}
}