繁体   English   中英

TreeCellRenderer吃CPU

[英]TreeCellRenderer eating CPU

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

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输出到树中?

我已经在上面添加了修改后的代码,但是现在我遇到了一个问题,即按钮无法正确显示(它们全部都变小了)。

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

更重要:

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

每次显示一个值时,您都会创建一个新的JLabelreturnLab = new JLabel(text); 这很贵。 将为每个重绘事件上显示的每个单元格调用此方法。 这比构建组件网格要昂贵得多,并且无法满足渲染器概念的整个目的。

请查看默认渲染器实现,以了解如何正确执行。 并看看教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM