【问题标题】:How do i change color of Jtree based on my dynamic changing Jtree for java desktop application如何根据我的 Java 桌面应用程序动态更改 Jtree 更改 Jtree 的颜色
【发布时间】:2015-11-25 15:09:42
【问题描述】:

大家,我正在用JPanelJFrame 制作桌面应用程序。这是我的树结构:

默认树

@Root
 |-L1B  (node-1)
 |-L2A (node-2)
 |-L1A (node-3)

在此之后,我正在读取一个文件(假设两个值:value1value2)并添加叶数据。

所以,我想像这样改变颜色:

@Root
 |**-L1B**  (node-1)(with green color)
    | value1(with green color)
    | value2(with green color)
 |-L2A (node-2)
 |-L1A (node-3)

value1 的值可能是 60s,这意味着在 60s 内它会先是绿色然后变成红色。

@Root
 |**-L1B**  (node-1)(with green color)
    | value1(with green red)
    | value2(with green color)
 |-L2A (node-2)
 |-L1A (node-3)

而在 60s 之后,value2 的值可能比 value1 多 60s,所以 60s 会先是绿色然后变成红色。

@Root
 |**-L1B**  (node-1)(with green color)
    | value1(with green red)
    | value2(with green color)
 |-L2A (node-2)
 |-L1A (node-3)

所以,基本上我想要运行进程的层次结构。当它运行时,颜色应该是绿色的,然后它会变成另一种颜色。

【问题讨论】:

标签: java swing applet jtree


【解决方案1】:

您正在寻找的是自定义渲染。

为此,请使用您的 JTree 并调用 setCellRenderer() 方法传入您的渲染器。

基本渲染器是DefaultTreeCellRenderer 的继承。返回渲染的方法是getTreeCellRendererComponent()

很遗憾,你的问题很模糊,所以我不能给出更具体的例子,所以一个通用的例子是:

JTree paintedTree = new JTree();
paintedTree.setCellRenderer(new DefaultTreeCellRenderer() {
    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
        Component renderedItem = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
        if (((YourClass)value).getTime() > 60) {
            renderedItem.setBackground(Color.GREEN);
        }

        return renderedItem;
    }
});

请注意,这个答案是严格从颜色渲染的角度来看的。 (((YourClass)value).getTime() > 60) 简化了用于确定进程是否正在运行的代码,以保持答案的焦点。

另外,请查看this 页面。它可能对您的追求有所帮助。

【讨论】:

  • public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expand, boolean leaf, int row, boolean hasFocus) { // code } 我已经创建了自己的渲染类,并且它完美运行.. 我的问题是我如何一次又一次地调用这个类及其 getTreeCellRendererComponent() 以及它的不同变化值。
  • @Krunal 在这种情况下,每次重绘容器时都会调用getTreeCellRendererComponent() 函数。因此,每当进程退出时,我都会调用repaint(),这将触发渲染,然后您可以测试进程是否正在运行,并显示正确的颜色。我希望这有帮助。让我知道这是否是您的意思。或者,使用正确的代码创建一个新问题,以便我更好地理解您的意思。
  • 我不知道如何在自定义渲染器类中传递值,以便我可以简单地将传递的值与 getTreeCellRendererComponent 方法 value param 进行比较。或者是否有任何方法可以将我的参数传递给这个getTreeCellRendererComponent()方法。
猜你喜欢
  • 1970-01-01
  • 2011-01-13
  • 2012-04-24
  • 2012-02-01
  • 2014-10-23
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
相关资源
最近更新 更多