Java Swing - Как отключить JPanel? - PullRequest
19 голосов
/ 26 апреля 2010

У меня есть несколько JComponent с на JPanel, и я хочу отключить все эти компоненты, когда нажимаю кнопку Пуск.

В настоящее время я отключаю все компоненты явно

component1.setEnabled(false);
:
:

Но есть ли способ, с помощью которого я могу отключить все компоненты одновременно? Я пытался отключить JPanel, к которому эти компоненты добавляются

panel.setEnabled(false);

но это не сработало.

Ответы [ 6 ]

23 голосов
/ 26 апреля 2010

Панель должна иметь метод getComponents(), который можно использовать в цикле для отключения подкомпонентов без явного присвоения им имен.

3 голосов
/ 26 апреля 2010

Панель Disabled поддерживает два подхода. Один для рекурсивного отключения компонентов, другой для «рисования» панели с отключенным внешним видом.

2 голосов
/ 28 мая 2013

Следующий метод использует рекурсию для достижения этой цели. Передайте любой 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);
}
2 голосов
/ 26 апреля 2010

Используйте JXLayer , с LockableUI .

0 голосов
/ 14 января 2017

Отключение должно происходить рекурсивно:

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()));
    }
}
0 голосов
/ 12 марта 2016

Следующий метод должен быть всем, что вам нужно добавить, вы можете вызвать его с помощью 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) {

    }
}
...