Java 树细胞
我有一个简单的TreeCellRenderer,它从节点提取一个JButton,并将其输出到JTreeJava 树细胞,java,swing,jbutton,jtree,Java,Swing,Jbutton,Jtree,我有一个简单的TreeCellRenderer,它从节点提取一个JButton,并将其输出到JTree public class ButtonCellRenderer extends JButton implements TreeCellRenderer { @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean exp
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.gettreeCellrenderComponent
,但没有存储值。如果以后没有创建渲染器,请再次调用此方法(如果c==null…
)。这本身就很昂贵
更重要的是:
渲染器应该是可重用的组件,并且仅针对要显示的特定值进行配置。这就是为什么默认实现重用标签,只设置文本、颜色、边框。。。这就是渲染器调用非常便宜的原因
每次显示值时,您都会创建一个新的JLabel
:returnLab=newjlabel(text)代码>。这个很贵。将为每个重绘事件上显示的每个单元格调用此方法。这比构建组件网格要昂贵得多,并且违背了渲染器概念的全部目的
请查看默认渲染器实现,以了解如何正确执行。并查看您正在调用的.gettreeCellrenderComponentsuper.gettreeCellrenderComponent
,而不存储该值。如果以后没有创建渲染器,请再次调用此方法(如果c==null…
)。这本身就很昂贵
更重要的是:
渲染器应该是可重用的组件,并且仅针对要显示的特定值进行配置。这就是为什么默认实现重用标签,只设置文本、颜色、边框。。。这就是渲染器调用非常便宜的原因
每次显示值时,您都会创建一个新的JLabel
:returnLab=newjlabel(text)代码>。这个很贵。将为每个重绘事件上显示的每个单元格调用此方法。这比构建组件网格要昂贵得多,并且违背了渲染器概念的全部目的
请查看默认渲染器实现,以了解如何正确执行。看看。为什么一开始就调用super
方法?(这可能不是问题所在,但似乎是多余的。)我不完全确定,这是在我看到的示例中,我想我只是忽略了它。然而,移除它似乎并没有多大作用。不要每次都创建一个新标签(虽然效果不应该达到30/50%)。验证是不必要的(毕竟,它只是一个标签)什么是ProgressButton?有没有可能它在后台做了一些肮脏的事情?ProgressButton只是一个内置了JProgressBar的按钮(尽管目前不工作)。谢谢你的提示,现在已经降到25~40左右了……好多了!不要在模型中存储组件,而是存储一个值(f.i.表示进度的int)。实现自定义渲染器(f.i.a progressBar)并使用该值配置该条。为什么在开始时调用super
方法?(这可能不是问题所在,但似乎是多余的。)我不完全确定,这是在我看到的示例中,我想我只是忽略了它。然而,移除它似乎并没有多大作用。不要每次都创建一个新标签(虽然效果不应该达到30/50%)。验证是不必要的(毕竟,它只是一个标签)什么是ProgressButton?有没有可能它在后台做了一些肮脏的事情?ProgressButton只是一个内置了JProgressBar的按钮(尽管目前不工作)。谢谢你的提示,现在已经降到25~40左右了……好多了!不要在模型中存储组件,而是存储一个值(f.i.表示进度的int)。实现一个自定义渲染器(f.i.a progressBar)并用该值配置该条。谢谢,尽管我现在已经纠正了这些错误。实际上,我想做的只是在JTree中显示JButton,我发现唯一有效的方法是使用渲染器。你可以使用JButton作为渲染器,只是不要在每次调用时都重新创建它。而且它不会是一个活动按钮,而只是“戳入”——这就是为什么你的setTooltip调用是无用的。如果你想要按钮,你也需要编写一个编辑器,改变点击行为。对不起,我不知怎么读的是“表格”而不是“树”。我更新了参考资料。如果启用,则设置工具提示有效。原则是一样的。谢谢,尽管我现在已经纠正了这些错误。实际上,我想做的只是在JTree中显示JButton,我发现唯一有效的方法是使用渲染器。你可以使用JButton作为渲染器,只是不要在每次调用时都重新创建它。而且它不会是一个活动按钮,而只是“戳入”——这就是为什么你的setTooltip调用是无用的。如果你想要按钮,你也需要编写一个编辑器,改变点击行为。对不起,我不知怎么读的是“表格”而不是“树”。我更新了参考资料。如果启用,则设置工具提示有效。原则是一样的。