Pregunta

Me parece que cuando llamo

Jtree.expandpath (camino)

Que, por defecto, todos sus padres también se expanden. Pero lo que realmente quiero hacer es establecer niños invisibles específicos para expandir por adelantado. De modo que cuando se expande un nodo, su sub-árbol completo sale a salir.

Lo he encontrado internamente en jtree expandedState.put(path, Boolean.TRUE); registra los nodos expandidos, pero no puedo obtener acceso a ello. (ps no quiero usar reflexión :)

Instalar el oyente para el evento de expansión, daría como resultado una gran cantidad de actualizaciones de tiempo de ejecución de apego. Es por eso que prefiero dejar que Jtree registre los estados ampliados.

Espero que haya otras formas de hacerlo.
¿Se agradece alguna ayuda?

Aceptó la solución del oyente. opcion 2

Opción 1 primordial:

Un inconveniente desagradable ... depende de la implementación de 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);
  }
}

Opción 2 oyente

/* 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;
}
¿Fue útil?

Solución

Te tendrás más fácil llamar

addTreeExpansionListener(TreeExpansionListener tel)

Cuando el treeExpanded(TreeExpansionEvent event) Se llama al método en su TreeEppansionListener, puede verificar si debe expandir recursivamente a todos los niños por la recién expandida TreePath.

Otros consejos

Una forma fácil de hacerlo es la subclase jtree y anular el método

setExpandedState(TreePath path, boolean state)

En este método, en lugar de expandir a todos los padres, amplíe solo los subpats que desea expandir. Eso es exactamente por qué el método está protegido :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top