JTreeノードを拡張する方法(事前に)が、それらを見えないままにしてください

StackOverflow https://stackoverflow.com/questions/1593553

  •  22-09-2019
  •  | 
  •  

質問

私が電話するとき、私はそう思われます

jtree.expandpath(パス)

デフォルトでは、すべての親も拡張されています。しかし、私が実際にやりたいことは、事前に拡大するために特定の目に見えない子供を設定することです。そのため、ノードが拡張されると、完全なサブツリーが飛び出します。

私はJTreeでそれを内部的に発見しました expandedState.put(path, Boolean.TRUE); 拡張されたノードを記録しますが、アクセスできません。 (PSリフレクションを使いたくない:)

拡張イベントのリスナーをインストールすると、多くの実行時間の更新が発生します。だからこそ、jtreeに拡張された状態を記録させたいと思っています。

それを行う他の方法があることを願っています。
何か助けてくれますか?

リスナーソリューションを受け入れました。オプション2

オプション1オーバーライド:

厄介な欠点の1つは、setExpandedState()の実装に依存しています

private boolean cIsExpandingHidden = false;
private TreePath cExpandingPath;

public void expandBranchHidden(DefaultMutableTreeNode node) {
  TreeNode[] mPathSections = mNode.getPath();
  TreePath mPath = new TreePath(mPathSections);
  //
  if (!cTree.isVisible(mPath)){
    cIsExpandingHidden = true;
  }
  cExpandingPath = mPath;
  try{
    expandPath(mPath);
  }finally{
    cExpandingPath = null;
    cIsExpandingHidden = false;
  }
}

@Override
public boolean isExpanded(TreePath path) {
  // override the questions whether the node parents of
  //  'the currently expanded node' to return TRUE
  if (cIsExpandingHidden){
    if (path.isDescendant(cExpandingPath)){
      return true; // just claim it doesn't need expanding
    }
  }
  return super.isExpanded(path);
}

@Override
public void fireTreeExpanded(TreePath path) {
  // the treeUI must not to know.. bad luck for any other listeners 
  if (!cIsExpandingHidden){
    super.fireTreeExpanded(path);
  }
}

オプション2リスナー

/* code where new nodes are received */
{
  // only if direct parent is expanded.. else expansionListener will pick it up
  if (cTree.isExpanded(mCreator.getParentTreeNode())){
    for (TreeNode mNode : mAddNodes) {
      if (mNode.isDefaultExpanded()) {
        cTree.expandBranch(mNode);
        mNode.setDefaultExpanded(false);
      }
    }
  }
}

/*  expansion listener */
{
  if (cRecursiveExpand){
    return;
  }
  // walk through children, expand and clear its preference
  cRecursiveExpand = true;
  IExtendedTreeNode[] mNodes = cTree.getChildrenOfCurrentNode();
  for (IExtendedTreeNode mNode : mNodes) {
    TreeNode mTreeNode = (TreeNode)mNode;
    if (mTreeNode.isDefaultExpanded()){
      cTree.expandBranch(mTreeNode);
      mTreeNode.setDefaultExpanded(false);
    }
  }
  cRecursiveExpand = false;
}
役に立ちましたか?

解決

電話をかける時間が簡単になります

addTreeExpansionListener(TreeExpansionListener tel)

いつ treeExpanded(TreeExpansionEvent event) TreeExpansionListenerが呼び出され、新しく拡張されたTreepathのためにすべての子供を再帰的に拡張すべきかどうかを確認することができます。

他のヒント

それを行う簡単な方法の1つは、サブクラスJtreeとメソッドをオーバーライドすることです

setExpandedState(TreePath path, boolean state)

この方法では、すべての親を拡大する代わりに、拡張したいサブパスのみを拡張します。それがまさにその方法が保護されている理由です:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top