fix: tree root node not displaying

This commit is contained in:
hstyi
2025-06-30 00:04:24 +08:00
committed by hstyi
parent 09d837f5b8
commit 885c0a6337
3 changed files with 22 additions and 2 deletions

View File

@@ -4,9 +4,11 @@ import app.termora.Disposable;
import app.termora.DocumentAdaptor;
import com.formdev.flatlaf.extras.components.FlatTextField;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.EventListenerList;
import javax.swing.event.TreeModelEvent;
@@ -117,7 +119,7 @@ public class FilterableTreeModel implements TreeModel, Disposable {
private void rebuildAndNotify(TreeModelEvent event) {
rebuildFilteredTree();
notifyTreeStructureChanged(event);
if (expand) {
if (expand && Arrays.stream(filters).anyMatch(Filter::canFilter)) {
expandAllNodes(tree, getRoot(), new TreePath(getRoot()));
}
}
@@ -194,7 +196,7 @@ public class FilterableTreeModel implements TreeModel, Disposable {
* @return true如果通过所有过滤器
*/
private boolean passesFilter(Object node) {
return Arrays.stream(filters).allMatch(filter -> filter.filter(node));
return Arrays.stream(filters).allMatch(filter -> !filter.canFilter() || filter.filter(node));
}
/**
@@ -221,6 +223,18 @@ public class FilterableTreeModel implements TreeModel, Disposable {
for (TreeModelListener listener : listeners) {
listener.treeStructureChanged(evt);
}
// 修复 “我的主机” 在过滤时新增文件夹会自动隐藏的问题
if (event != null) {
final TreePath treePath = event.getTreePath();
final Object lastPathComponent = treePath.getLastPathComponent();
if (lastPathComponent instanceof SimpleTreeNode<?> c) {
final SimpleTreeNode<?> parent = c.getParent();
if (StringUtils.equals("0", c.getId()) || (parent != null && StringUtils.equals("0", parent.getId()))) {
SwingUtilities.invokeLater(() -> SwingUtilities.updateComponentTreeUI(tree));
}
}
}
}
}

View File

@@ -183,6 +183,10 @@ class WelcomePanel(private val windowScope: WindowScope) : JPanel(BorderLayout()
|| node.host.username.contains(text)
}
override fun canFilter(): Boolean {
return searchTextField.text.isNotBlank()
}
})
searchTextField.addKeyListener(object : KeyAdapter() {

View File

@@ -3,4 +3,6 @@ package app.termora.tree
interface Filter {
fun filter(node: Any): Boolean
fun canFilter() = true
}