我有一个以a表示的数据对象TreeModel,我只想在我的节目中显示它的一部分JTree- 为了争论,说叶子和他们的父母.如何隐藏/过滤不必要的节点?
我创建了一个自定义JTree.可以过滤该树以仅显示包含给定条件(字符串)的那些节点.现在,有没有办法只扩展那个包含搜索字符串的DefaulMutableTreeNode部分?
如果树节点具有label ="StackOverflow"并且用户正在搜索包含"Stack"的节点,则"StackOverflow"节点将以"Stack"部分粗体呈现.
怎么实现呢?
有几个相关的问题,关于在设置新的TreeModel时自动扩展JTree,或者关于扩展JTree的一般问题,其中一些也是针对在JTree中扩展许多路径的性能.
但是,所提出的解决方案似乎都没有涵盖人们可以考虑的"简单"应用案例:我有一棵大树(也就是说,树很深,很宽,或两者兼而有之),我想完全以编程方式扩展它.
以下是显示问题的MCVE:它创建一个具有100k节点的树模型.按下按钮会触发调用expandAll,该调用尝试使用从相关问题的答案派生的方法扩展所有节点.
问题是扩展这些100k节点需要大约13秒(在普通机器上,使用最近的JVM).
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.util.function.Consumer;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
public class TreeExpansionPerformanceProblem
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(
() -> createAndShowGUI());
}
private static void createAndShowGUI()
{
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().setLayout(new GridLayout(1,0));
f.getContentPane().add(createTestPanel(
TreeExpansionPerformanceProblem::expandAll));
f.setSize(800,600);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
private static JPanel createTestPanel(Consumer<JTree> …Run Code Online (Sandbox Code Playgroud)