2009-11-17 43 views
0

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

基本上我想创建类似的东西,像这里Changing JList row color at runtime,但对于JTree。

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

我该怎么办?

+0

“Mógłbymużyćpodobnej techniki”是什么意思? – jitter 2009-11-17 22:28:43

+0

对不起:(我正在尝试检查拼写,并在谷歌treanslate中的错误行上使ctr + c + ctr + v ... :) – 2009-11-18 01:33:37

回答

1

入住这Highlight a node's descendants in JTree

你可以很容易地修改它,而不是强调父母,现在你只需要设定定时突出就像我所提供的其他线程的解决方案解决堵塞。突出显示,计时器,取消突出显示。

使用SwingWorker加上可能的Executor如果更新模型频繁,你要在突出线程的执行一定的控制

2

首先,在更新业务模型时,确保在树模型中激发适当的树更新事件,以便JTree知道要更新。

然后,您需要定义一个设置颜色的TreeCellRenderer。当业务模型更新时,告诉渲染器突出显示哪些节点。

但是,这里的诀窍是关闭颜色。你可以定义一个Thread或者更好的Executor来休眠1000毫秒,然后告诉渲染器不再突出显示节点,然后再次触发树更新事件,这样JTree将重新适当地重绘。

+0

您不应该定义任意线程或执行程序来触发树更新事件,因为这应该在事件调度线程中被解雇。 – Adamski 2009-11-17 22:49:43

+0

是的。可以使用SwingWorker或SwingWorker + Executor – jitter 2009-11-17 22:58:21

+1

这可以工作,也可以使用SwingUtilities.invokeLater()将树更新置于UI线程中。 – 2009-11-18 20:31:19

0

应该用的SwingWorker被提高了时间后uncolor回:

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

}