在运行时更新JTree节点背景颜色

时间:2009-11-17 20:41:26

标签: java user-interface swing jtree

我需要在业务逻辑更新模型时更改树节点颜色,等待1秒,然后再更改其颜色。

基本上我想创建类似于Changing JList row color at runtime的类似内容,但是对于JTree。

所以我可以使用类似的技术,但我也不会改变祖先节点的颜色,所以即使没有扩展,用户也可以看到通知。

我该怎么做?

3 个答案:

答案 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;
    }

}