3

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

JTree.expandPath( パス )

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

JTree の内部で展開されたノードが記録されていることがわかりましたが expandedState.put(path, Boolean.TRUE);、アクセスできません。(ps リフレクションは使いたくない :)

展開イベントのリスナーをインストールすると、多くのランタイム更新が発生します。そのため、JTree に展開された状態を記録させることを好みます。

他の方法があることを願っています。
何か助けていただければ幸いです。

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

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

1 つの厄介な drawBack..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;
}
4

2 に答える 2

1

電話をかけやすくなります

addTreeExpansionListener(TreeExpansionListener tel)

TreeExpansionListenerのtreeExpanded(TreeExpansionEvent event) メソッドが呼び出されると、新しく展開された TreePath のすべての子を再帰的に展開する必要があるかどうかを確認できます。

于 2009-10-20T15:21:24.543 に答える
1

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

setExpandedState(TreePath path, boolean state)

この方法では、すべての親を展開する代わりに、展開するサブパスのみを展開します。それがまさにメソッドが保護されている理由です:)

于 2009-10-21T06:52:46.610 に答える