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 に答える