对a应用过滤JTree以避免某些节点/叶子出现在渲染版本中JTree.理想情况下,我正在寻找一个允许动态过滤器的解决方案,但如果我能让静态过滤器工作,我会很高兴.
为了使它更容易一些,让我们假设JTree只支持渲染,而不是编辑.应该可以移动,添加,删除节点.
一个例子是a上面的搜索字段JTree,而在键入时,JTree只显示带有匹配的子树.
一些限制:它将用于可以访问JDK和SwingX的项目中.我想避免包含其他第三方库.
我已经想到了一些可能的解决方案,但这些都不是理想的
基于模型的过滤
TreeModel以过滤掉一些值.快速而简单的版本很容易编写.过滤掉节点,并且在过滤器或委托TreeModel的每次更改时,装饰器都可以触发整个树发生变化的事件(treeStructureChanged根节点作为节点).将它与恢复选择状态和扩展状态的侦听器相结合JTree,你会得到一个或多或少有效的版本,但是来自它的事件TreeModel都搞砸了.这或多或少是这个问题中使用的方法TreeModel但尝试点燃正确的事件.我(还)没有设法提出这个的工作版本.它似乎需要委托的副本,TreeModel以便能够在从委托模型中删除节点时使用正确的子索引触发事件.我认为有更多的时间我可以让它工作,但它只是感觉不对(过滤感觉像视图应该做的事情,而不是模型)TreeModel.但是,这完全是不可重用的,并且可能和编写装饰器一样困难TreeModel基于视图的过滤
这似乎是要走的路.过滤不应影响模型,只影响视图.
我看了RowFilter上课.虽然javadoc似乎建议你可以结合使用它JTree:
当与JTree相关联时,条目对应于节点.
我找不到RowFilter(或RowSorter)和JTree班级之间的任何联系.RowFilterSwing教程的标准实现似乎表明RowFilter只能直接使用JTable(参见参考资料JTable#setRowSorter).没有类似的方法可供选择JTree
JXTreejavadoc.它有一个ComponentAdapter可用的,并且javadoc ComponentAdapter表示RowFilter可以与目标组件进行交互,但我看不出如何建立RowFilter和之间的链接JTreeJTable使用RowFilter …我有自定义JTree和习惯JModel; 当我给它一个新的模型时,我会让JTree"自动扩展".目前,它只是将所有节点折叠到根目录.
这是一个例子:
private class CustomTree extends JTree {
@Override
public boolean isExpanded(TreePath path) {
return ((Person) path.getLastPathComponent).hasChildren();
}
private class CustomTreeModel extends TreeModel {
// ... omitting various implementation details
@Override
public boolean isLeaf(Object object) {
return !((Person) object).hasChildren();
}
}
Model model = new Model();
Person bob = new Person();
Person alice = new Person();
bob.addChild(alice);
model.setRoot(bob);
JTree tree = new CustomTree(new CustomTreeModel(model));
Run Code Online (Sandbox Code Playgroud)
此时,树正确显示:
- BOB
- ALICE
Run Code Online (Sandbox Code Playgroud)
Alice是Bob的孩子(在数据和可视化树中)
但是,如果我打电话:
tree.setModel(new CustomTreeModel(model));
Run Code Online (Sandbox Code Playgroud)
一切都崩溃了:
+ …Run Code Online (Sandbox Code Playgroud) 使用JTree,假设根节点为0级,并且根目录下可能有多达5个级别,如何轻松扩展所有1级节点,以便所有1级和2级分支和叶子都可见,但3级及以下都没有?
我正在尝试为特定目的创建一些特殊组件,在该组件上我需要绘制一个HTML字符串,这是一个示例代码:
public class MyComponent extends JComponent{
public MyComponent(){
super();
}
protected void paintComponent(Graphics g){
//some drawing operations...
g.drawString("<html><u>text to render</u></html>",10,10);
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,drawString方法似乎没有识别HTML格式,它愚蠢地绘制字符串就像它一样.
有没有办法让这项工作?
我有大量的网址,我想实现自动完成.我不喜欢天真方法的复杂性,因为它与设定大小呈线性关系:
for(String url: urls) if(url.startsWith(input) {doSomething();}
Run Code Online (Sandbox Code Playgroud)
现在我知道在Hash Set中,函数"contains()"在"O(1)"中起作用,但是没有"containsPrefix()".有没有像Lucene这样的大型图书馆或自己编写的简单方法?我没有问题这样做但是对于这样一个简单的问题似乎有点过头了所以我想知道是否有现成的简单解决方案:-)
从我的计算机科学课程中,我记得一个由字符串片段组成的树,但我忘了它是如何调用的.它的工作方式如下:
[car, care, carrot,carrotville]->
car
|
-/
-e
-rrot
|
----ville
Run Code Online (Sandbox Code Playgroud)
PS:我如何调用返回字符串为前缀的所有字符串的方法?就像a是b的前缀一样,b是什么?
java ×5
swing ×4
jtree ×3
graphics2d ×1
html ×1
indexing ×1
jcomponent ×1
prefix ×1
swingx ×1
tree ×1