我有一个广泛的Gui,其中包含许多组件。有updateEnable()
个方法可以根据某些配置更新所有组件的启用状态。
我基本上首先将其启用状态设置为true,然后禁用其中一些(基于配置):
private void updateEnable() {
enableAllRec(panel, true);
// disable some components
}
private void enableAllRec(Container root, boolean b) {
if (root == null) return;
for (Component c : root.getComponents()) {
c.setEnabled(b);
if (c instanceof Container) enableAllRec((Container) c, b);
}
}
我这样做的原因是某些组件没有存储为成员变量,我无法访问它们。然而,他们可以改变他们的状态,因为我初始化了他们中的一些(例如):
final JLabel exampleLabel = new JLabel("yoink");
final JCheckBox exampleCheckBox = new JCheckBox("boing");
exampleCheckBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
exampleLabel.setEnable(exampleCheckBox.isSelected());
}
});
现在我的问题如下:当我调用updateEnable()
时,某些(存储的)组件可能会闪烁,因为它们已启用,然后在一段时间后再次禁用。我想阻止这一点。我的想法是以某种方式阻止GUI刷新到updateEnable()
的最后,然后执行updateUI()
。但这不是很优雅,我不知道如何防止GUI更新。
我是否错过了针对这个问题的非常优雅的替代解决方案?
非常感谢, 斯蒂芬
答案 0 :(得分:1)
如果由于某些逻辑更改和计算而连续几次启用/禁用了您的组件 - 您应该在对可视组件应用某些更改之前执行该计算。在这种情况下,您将直接将组件状态更改为最终组件。
答案 1 :(得分:0)
好的,我的方法似乎有效。我只是将enableAllRec(Container root, boolean b)
扩展为包含一些排除项:
private void enableAllRec(Container root, boolean defaultState, Set<Component> disableList, Set<Component> enableList) {
if (root == null) return;
for (Component c : root.getComponents()) {
if (disableList != null && disableList.contains(c)) {
c.setEnabled(false);
disableList.remove(c);
} else if (enableList != null && enableList.contains(c)) {
c.setEnabled(true);
enableList.remove(c);
} else c.setEnabled(defaultState);
if (c instanceof Container) enableAllRec((Container) c, defaultState, disableList, enableList);
}
}
这样,我可以确定我想要启用/禁用的所有组件,将它们添加到相应的集合然后调用enableAllRec。例如:
Set<Component> enableList = new HashSet<Component>();
enableList.add(searchFreqButton);
enableList.add(advMeasButton);
enableAllRec(configPanel, false, null, enableList);
显然,这对于大型套装来说并不理想,但它足以满足我的需求(800个组件和套件不超过20-30个组件)。我怀疑这种方法也可以轻松处理更大的集合。
在上面的例子中,引入disableList是没有意义的(因为默认情况下所有组件都将被禁用)。因此,根据默认值,可以省略相应的集合。这当然应该在enableAllRec()
中完成。