我需要在业务逻辑更新模型时更改树节点颜色,等待1秒,然后再更改其颜色。
基本上我想创建类似于Changing JList row color at runtime的类似内容,但是对于JTree。
所以我可以使用类似的技术,但我也不会改变祖先节点的颜色,所以即使没有扩展,用户也可以看到通知。
我该怎么做?
答案 0 :(得分:2)
首先,更新业务模型时,请确保在树模型中触发相应的树更新事件,以便JTree知道更新。
然后你需要定义一个设置颜色的TreeCellRenderer。更新业务模型后,告诉渲染器要突出显示哪些节点。
然而,这里的诀窍是关闭颜色。您可以定义一个Thread或更好的Executor来休眠1000毫秒然后告诉渲染器不再突出显示节点,然后再次触发树更新事件,以便JTree将重新适当地重新绘制。
答案 1 :(得分:1)
选中此Highlight a node's descendants in JTree
您可以轻松修改它而不是突出显示父级,现在您只需插入一个定时突出显示的解决方案,就像我在另一个线程上提供的解决方案一样。突出显示,计时器,未设置突出显示。
如果对模型的更新频繁,并且您希望控制突出显示线程的执行,则使用SwingWorker加上Executor
答案 2 :(得分:0)
应该使用SwingWorker进行改进,以便在一段时间后重新着色:
class RuntimeTreeRender extends DefaultTreeCellRenderer {
boolean specialColor = false;
@Override
public Color getBackgroundNonSelectionColor() {
if(specialColor) {
return Color.GREEN;
} else {
return null;
}
}
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean arg2, boolean arg3, boolean arg4, int arg5, boolean arg6) {
Component c = super.getTreeCellRendererComponent(tree, value, arg2, arg3, arg4, arg5, arg6);
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
if(YOUR_CONDITION_ON_NODE) { // for exammple : node.getUserObject().toString().contains("a")
specialColor = true;
} else {
specialColor = false;
}
return c;
}
}