首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TreeCellRenderer吃CPU

TreeCellRenderer吃CPU
EN

Stack Overflow用户
提问于 2012-02-14 23:23:56
回答 1查看 275关注 0票数 1

我有一个简单的TreeCellRenderer,它从节点中提取一个JButton,并将其输出到JTree。

代码语言:javascript
复制
public class ButtonCellRenderer extends JButton implements TreeCellRenderer {

  @Override
  public Component getTreeCellRendererComponent(JTree tree, Object value, boolean     selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
    //setBackgroundNonSelectionColor(tree.getBackground());
    ProgressButton b = null;
    if ((value != null) && (value instanceof DefaultMutableTreeNode)) {
      Object userObject = ((DefaultMutableTreeNode) value).getUserObject();
      if (userObject instanceof ProgressButton) {
        b = (ProgressButton) userObject;
        return b;
      }
    }
    if (b == null) {
      System.out.println("Null!");
      DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer();
      return defaultRenderer.getTreeCellRendererComponent(tree,
              value, selected, expanded, leaf, row, hasFocus);
    } else {
      System.out.println("Returning label");
      return new JLabel(b.getToolTipText(), b.getIcon(), SwingConstants.CENTER);
    }
  }
}

我不知道为什么,但它似乎卡住了循环,并消耗了大约30%~50%的CPU。有什么方法可以消除这种情况吗?或者不必使用渲染器将JButton输出到树中?

我已经添加了上面修改过的代码,但是现在我遇到了一个按钮不能正确显示的问题(它们都很小)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-14 23:38:20

您正在调用super.getTreeCellRendererComponent,但没有存储值。如果以后没有创建渲染器,则再次调用此方法(if c==null...)。这本身就很昂贵。

更重要的是:

渲染器应该是一个可重用的组件,并且只为要显示的特定值进行配置。这就是为什么默认实现重用标签,只设置文本、颜色、边框……这就是为什么渲染器调用非常便宜的原因。

每次显示一个值:returnLab = new JLabel(text);时,都会创建一个新的JLabel。这太贵了。此方法将为每个重绘事件中显示的每个单元格调用。这比构建组件网格要昂贵得多,并且违背了渲染器概念的全部目的。

请看一下默认的渲染器实现,看看如何正确地完成它。来看看tutorial吧。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9279481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档