当前位置:  开发笔记 > 编程语言 > 正文

如何在Swing中禁用容器及其子代

如何解决《如何在Swing中禁用容器及其子代》经验,为你挑选了2个好方法。

我想不出办法在Swing中禁用容器及其子代.Swing真的缺少这个基本功能吗?

如果我在容器上执行setEnabled(false),则其子项仍处于启用状态.

我的GUI结构非常复杂,并且对容器下面的所有元素进行转换不是一种选择.GlassPane也不在容器顶部(容器不是整个窗口).



1> VonC..:

要添加到mmyers的答案,禁用孩子并不是一件容易的事(请参阅此主题)

在一般情况下,问题几乎无法解决.这就是为什么它不是核心Swing的一部分.

从技术上讲,禁用和存储旧状态后跟启用和恢复到旧状态可能看起来很有吸引力.在特殊情况下,它甚至可能是一个不错的选择.但是有两个问题(至少可能还有更多).

复合成分

递归必须停在"复合组件"(或"单个实体")上.然后组件负责保持依赖状态.没有通用的方法来检测这样的组件 - 例如JComboBox,JXDatePicker(作为相关问题)

为了使事情变得更复杂,依赖者不需要在"复合组件"的层次结构下,因此,JXTable负责处理ColumnControl(和头部)的启用状态.

试图解决两者都需要

a)大院的财产:"不要触摸我的孩子"和
b)未受约束的家属的财产:"别碰我"

绑定到启用

如果启用状态绑定到(表示或其他)模型属性并且该属性在此期间发生更改,则enable-and-update-to-old可能会破坏应用程序状态 - 现在旧状态无效.

试图解决这个问题需要

c)"真实的"存储旧的启用的视图关注属性
d)将表示模型属性绑定到启用的和存储的旧的启用

JXRadioGroup有一个问题的变体:在禁用时 - 组本身或通用控制器 - 跟踪每个按钮的旧启用.按钮已启用由操作控制 - 如果有操作.因此,启用的控制器需要恢复到启用旧功能或启用操作.在组的禁用(as-group)期间,如果Action的启用在存储时为false并且更改为true,则会出现问题.添加了另一个动作.

现在想象一下重载时状态转换的复杂性a) - d)



2> Michael Myer..:

根据这篇文章,JXLayer可能正是你要找的东西:

使用JXLayer包装容器并在此JXLayer.setLocked(true)之后调用- 内部的所有组件都将被禁用

alt text http://www.java.net/download/javadesktop/blogs/alexfromsun/2007.06.25/LayerDemo.PNG

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有