Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 树细胞_Java_Swing_Jbutton_Jtree - Fatal编程技术网

Java 树细胞

Java 树细胞,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

我有一个简单的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.gettreeCellrenderComponent
,但没有存储值。如果以后没有创建渲染器,请再次调用此方法(
如果c==null…
)。这本身就很昂贵

更重要的是:

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

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


请查看默认渲染器实现,以了解如何正确执行。并查看您正在调用的.gettreeCellrenderComponent
super.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调用是无用的。如果你想要按钮,你也需要编写一个编辑器,改变点击行为。对不起,我不知怎么读的是“表格”而不是“树”。我更新了参考资料。如果启用,则设置工具提示有效。原则是一样的。