Java Swing:阻止组件更新启用状态,直到我告诉他们

时间:2012-05-11 10:23:35

标签: java swing

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

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

非常感谢, 斯蒂芬

2 个答案:

答案 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()中完成。