Мне кажется, что когда я звоню
JTree.expandPath(путь)
Что по умолчанию все его родители также расширены. Но что я на самом деле хочу сделать, так это заранее настроить конкретных невидимых дочерних элементов. Так что, когда узел расширяется, появляется его полное поддерево.
Я обнаружил, что внутри JTree expandedState.put(path, Boolean.TRUE);
записываются расширенные узлы, но я не могу получить к ним доступ. (ps я не хочу использовать отражение :)
Установка прослушивателя для события расширения приведет к запуску большого количества обновлений во время выполнения. Вот почему я предпочитаю, чтобы JTree записывал расширенные состояния.
Надеюсь, что есть и другие способы сделать это.
Любая помощь приветствуется?
Принято решение Listener. Вариант 2
Вариант 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;
}