当业务逻辑更新模型时,我需要更改树节点的颜色,等待 1 秒,然后将其颜色更改回来。
基本上我想创建类似的东西,比如在运行时更改 JList 行颜色,但是对于 JTree。
所以我可以使用类似的技术,但我也不会改变祖先节点的颜色,所以即使没有展开,用户也可以看到通知。
我该怎么做?
当业务逻辑更新模型时,我需要更改树节点的颜色,等待 1 秒,然后将其颜色更改回来。
基本上我想创建类似的东西,比如在运行时更改 JList 行颜色,但是对于 JTree。
所以我可以使用类似的技术,但我也不会改变祖先节点的颜色,所以即使没有展开,用户也可以看到通知。
我该怎么做?
首先,当业务模型更新时,请确保在树模型中触发适当的树更新事件,以便 JTree 知道要更新。
然后您需要定义一个设置颜色的 TreeCellRenderer。当业务模型更新时,告诉您的渲染器要突出显示哪些节点。
然而,这里的诀窍是关闭颜色。您可以定义一个线程或更好的执行器来休眠 1000 毫秒,然后告诉渲染器不再突出显示节点,然后再次触发树更新事件,以便 JTree 将适当地重新绘制。
您可以轻松地对其进行修改以突出显示父级,现在您只需要插入一个定时突出显示的解决方案,就像我在另一个线程上提供的解决方案一样。突出显示,计时器,未设置的突出显示。
如果模型更新频繁并且您希望对突出显示线程的执行进行一些控制,则使用SwingWorker加上可能的Executor
应该使用 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;
}
}