我想不出办法在Swing中禁用容器及其子代.Swing真的缺少这个基本功能吗?
如果我在容器上执行setEnabled(false),则其子项仍处于启用状态.
我的GUI结构非常复杂,并且对容器下面的所有元素进行转换不是一种选择.GlassPane也不在容器顶部(容器不是整个窗口).
要添加到mmyers的答案,禁用孩子并不是一件容易的事(请参阅此主题)
在一般情况下,问题几乎无法解决.这就是为什么它不是核心Swing的一部分.
从技术上讲,禁用和存储旧状态后跟启用和恢复到旧状态可能看起来很有吸引力.在特殊情况下,它甚至可能是一个不错的选择.但是有两个问题(至少可能还有更多).
复合成分
递归必须停在"复合组件"(或"单个实体")上.然后组件负责保持依赖状态.没有通用的方法来检测这样的组件 - 例如JComboBox,JXDatePicker(作为相关问题)
为了使事情变得更复杂,依赖者不需要在"复合组件"的层次结构下,因此,JXTable负责处理ColumnControl(和头部)的启用状态.
试图解决两者都需要
a)大院的财产:"不要触摸我的孩子"和
b)未受约束的家属的财产:"别碰我"绑定到启用
如果启用状态绑定到(表示或其他)模型属性并且该属性在此期间发生更改,则enable-and-update-to-old可能会破坏应用程序状态 - 现在旧状态无效.
试图解决这个问题需要
c)"真实的"存储旧的启用的视图关注属性
d)将表示模型属性绑定到启用的和存储的旧的启用JXRadioGroup有一个问题的变体:在禁用时 - 组本身或通用控制器 - 跟踪每个按钮的旧启用.按钮已启用由操作控制 - 如果有操作.因此,启用的控制器需要恢复到启用旧功能或启用操作.在组的禁用(as-group)期间,如果Action的启用在存储时为false并且更改为true,则会出现问题.添加了另一个动作.
现在想象一下重载时状态转换的复杂性a) - d)
根据这篇文章,JXLayer可能正是你要找的东西:
使用JXLayer包装容器并在此
JXLayer.setLocked(true)
之后调用- 内部的所有组件都将被禁用
alt text http://www.java.net/download/javadesktop/blogs/alexfromsun/2007.06.25/LayerDemo.PNG