0

我有一个广泛的 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 更新。

我是否错过了一个非常优雅的替代解决方案来解决这个问题?

非常感谢,斯特凡

4

2 回答 2

1

如果您的组件可能由于某些逻辑更改和计算而连续启用/禁用几次 - 您应该在将某些更改应用于可视组件之前执行该计算。在这种情况下,您会将组件状态直接更改为最终状态。

于 2012-05-11T11:01:59.677 回答
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()

于 2012-05-15T10:58:50.637 回答