gpt4 book ai didi

java - TreeCellRenderer 吃 CPU

转载 作者:行者123 更新时间:2023-11-29 08:09:18 26 4
gpt4 key购买 nike

我有一个简单的 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...)。这本身就很昂贵。

更重要的是:

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

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

请查看默认渲染器实现以了解如何正确执行此操作。看看 tutorial .

关于java - TreeCellRenderer 吃 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9279481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com