有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSwing:在我告诉组件更新启用状态之前,防止组件更新启用状态

我有一个包含许多组件的广泛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) 个答案

  1. # 1 楼答案

    好的,我的方法似乎有效。我刚刚扩展了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毫无意义(因为默认情况下所有组件都将被禁用)。因此,根据默认值,可以省略相应的集合。当然,这最好在{}中完成

  2. # 2 楼答案

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