Java 在JPanel中调用setEnabled(false)的原因

Java 在JPanel中调用setEnabled(false)的原因,java,swing,jpanel,Java,Swing,Jpanel,我现在在Swing上工作了一段时间,但在实践中从未遇到过必须在JPanel中调用setEnabled(false)的情况。 尽管如此,我有时在一些复杂的gui中看到这样的代码。但我真的不明白为什么有人想用它? 因此,请给我一些在JPanel上需要使用setEnabled(false)的现实生活中常见情况的例子 同样在javadoc中,它说: 禁用组件不会禁用其子组件 实际上,我有一个bug,因为禁用的JPanel中的表在调整列大小时没有显示鼠标调整光标。我怀疑这里还有其他令人不快的惊喜。原因之一

我现在在Swing上工作了一段时间,但在实践中从未遇到过必须在
JPanel
中调用
setEnabled(false)
的情况。 尽管如此,我有时在一些复杂的gui中看到这样的代码。但我真的不明白为什么有人想用它? 因此,请给我一些在
JPanel
上需要使用
setEnabled(false)
的现实生活中常见情况的例子

同样在javadoc中,它说:

禁用组件不会禁用其子组件


实际上,我有一个bug,因为禁用的
JPanel
中的表在调整列大小时没有显示鼠标调整光标。我怀疑这里还有其他令人不快的惊喜。

原因之一是getEnabled()将反映正确的状态。 考虑某个事件处理程序想要标记面板的情况。 不再启用,且在事件发生时不谨慎 迭代并禁用所有子组件。其他部分 应用程序可能需要通过getEnabled()测试面板的状态以 确定在应用程序中的不同点执行的操作

我个人从来没有这样做过,但现在你问了我,并得到了我
我想我可能会用这个。谢谢&&+=1至问题。

启用/禁用容器中所有组件的启动程序代码

JPanel p = new JPanel();
p.setEnabled(state);
setEnabledAll(p, state);

public void setEnabledAll(Object object, boolean state) {
    if (object instanceof Container) {
        Container c = (Container)object;
        Component[] components = c.getComponents();
        for (Component component : components) {
            setEnabledAll(component, state);
            component.setEnabled(state);
        }
    }
    else {
        if (object instanceof Component) {
            Component component = (Component)object;
            component.setEnabled(state);
        }
    }
}

我相信您可以通过这种方式禁用顶级窗口,但不能禁用container@Hovercraft满是鳗鱼:杰帕内尔仍然有这样的方法。对我来说,这看起来像是一个毫无用处的潜在bug来源。但也许我弄错了,它对JPanel有一些实际的用途。使用swing就像是千刀斩尽。什么都不做的方法?真的吗?我想如果你禁用所有的孩子,这是一个有效的用法。否则,它可能会导致类似于我问题中描述的错误。顺便说一下,这是一个很好的例子。遗憾的是,Swing无法在一行代码中禁用组件的所有子级。在utils类中使用setEnabledAll()就足够简单了。我会添加一个,以防有人需要了解如何做。如果没有相关的期望行为,一个简单的状态标志没有多大价值。您的
setEnabledAll()
显然是对JPanel(或者更一般地说是对任何视图元素,如组件)的扩展。我总是在秋千上发现这样的挠头。