Java Swing - 如何禁用JPanel?

问题描述 投票:19回答:6

我在JComponent上有几个JPanels,我想在按下“开始”按钮时禁用所有这些组件。

目前,我正在明确禁用所有组件

component1.setEnabled(false);
:
:

但无论如何,我可以一次禁用所有组件吗?我试图禁用添加这些组件的JPanel

panel.setEnabled(false);

但它不起作用。

java swing jpanel
6个回答
23
投票

该面板应该有一个getComponents()方法,可以在循环中使用它来禁用子组件而无需显式命名它们。


3
投票

Disabled Panel为两种方法提供支持。一个以递归方式禁用组件,另一个以“禁用”外观“绘制”面板。


2
投票

使用带有LockableUI的JXLayer。


2
投票

以下方法使用递归来实现此目的。传入任何Container,此方法将返回位于Component“内部”任何位置的所有非Container组件的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);
}

0
投票

以下方法应该是您需要添加的所有内容,您可以使用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) {

    }
}

0
投票

禁用应以递归方式发生:

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()));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.