【问题标题】:Updating JTree nodes background color at runtime在运行时更新 JTree 节点背景颜色
【发布时间】:2009-11-17 20:41:26
【问题描述】:

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

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

所以我可以使用类似的技术,但我也不会更改祖先节点的颜色,因此即使未展开用户也可以看到通知。

我该怎么做?

【问题讨论】:

  • “Mógłbym użyć podobnej techniki”是什么意思?
  • 抱歉 :(,我试图检查拼写并在 google treanslate 中的错误行上设置 ctr+c + ctr+v ... :)

标签: java user-interface swing jtree


【解决方案1】:

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

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

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

【讨论】:

  • 您不应定义任意线程或执行程序来触发树更新事件,因为这应该在事件调度线程上触发。
  • 是的。而是使用 SwingWorker 或 SwingWorker + Executor
  • 这可以工作,或者使用 SwingUtilities.invokeLater() 将树更新放在 UI 线程中。
【解决方案2】:

查看Highlight a node's descendants in JTree

您可以轻松地对其进行修改以突出显示父级,现在您只需插入一个用于定时突出显示的解决方案,就像我在另一个线程上提供的解决方案一样。突出显示、计时器、未设置的突出显示。

使用SwingWorker 加上Executor 如果模型更新频繁并且您希望对突出显示线程的执行进行一些控制

【讨论】:

    【解决方案3】:

    应该使用 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;
        }
    

    }

    【讨论】:

      猜你喜欢
      • 2019-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-07
      • 2020-01-17
      • 1970-01-01
      相关资源
      最近更新 更多