【问题标题】:Jtree getTreeCellRendererComponent execute several timesJtree getTreeCellRendererComponent 执行多次
【发布时间】:2011-12-24 12:41:10
【问题描述】:

我遇到了自定义 TreeCellRenderer 的问题。 当我单击一个节点时,可覆盖的方法 getTreeCellRendererComponent 大约执行了 4 次。有人对此有任何想法吗? 提前致谢。

西蒙

我的代码:

    @Override
public Component getTreeCellRendererComponent(JTree tree, Object p_value,
        boolean selected, boolean expanded, boolean leaf, int row,
        boolean hasFocus) {
    super.getTreeCellRendererComponent(tree, p_value, selected, expanded,
            leaf, row, hasFocus);
    if (row != -1) {
        DefaultMutableTreeNode aNode = (DefaultMutableTreeNode) p_value;
        TreePath treePath;

        treePath = tree.getPathForRow(row);
        if (treePath == null) {
            return this;
        }
        // int pathCount = treePath.getPathCount();
        JLabel label = (JLabel) this;
        if (aNode.getUserObject() instanceof MlCompteMail) {
            traiteNomCompte((MlCompteMail) aNode.getUserObject(), label);
            // JTreeFactory treeFact = new JTreeFactory();
            // treeFact.refreshNode(treePath);

            return this;
        } else if (aNode.getUserObject() instanceof MlDossier) {
            traiteNomDossier((MlDossier) aNode.getUserObject(), label, leaf);
            // JTreeFactory treeFact = new JTreeFactory();
            // treeFact.refreshNode(treePath);
            return this;
        }
    }

    return this;
}

/**
 * @param value
 * @param treePath
 * @param label
 * @param p_leaf
 */
private void traiteNomDossier(MlDossier p_dossier, JLabel label,
        boolean p_leaf) {
    String nomDossier = p_dossier.getNomDossier();
    if (nomDossier.equals(EnDossierBase.BROUILLON.getLib())) {
        label.setIcon(IconeTreeFactory.getBrouillon());
    } else if (nomDossier.equals(EnDossierBase.CORBEILLE.getLib())) {
        label.setIcon(IconeTreeFactory.getCorbeille());
    } else if (nomDossier.equals(EnDossierBase.ENVOYES.getLib())) {
        label.setIcon(IconeTreeFactory.getEnvoye());
    } else if (nomDossier.equals(EnDossierBase.RECEPTION.getLib())) {
        label.setIcon(IconeTreeFactory.getReception());
    } else if (nomDossier.equals(EnDossierBase.SPAM.getLib())) {
        label.setIcon(IconeTreeFactory.getSpam());
    } else if (p_leaf) {
        label.setIcon(IconeTreeFactory.getDossierFerme());
    } else {
        label.setIcon(IconeTreeFactory.getDossierOuvert());
    }
    int unreadMess = p_dossier.getUnreadMessCount();
    if (unreadMess > 0) {
        label.setText(nomDossier + " (" + unreadMess + ")");
        label.setFont(Fontfactory.getTREE_FONT_GRAS());
    } else {
        label.setText(nomDossier);
        label.setFont(Fontfactory.getTREE_FONT_PLAIN());
    }
    return;
}

// }
// }

/**
 * @param value
 * @param label
 */
private void traiteNomCompte(MlCompteMail p_compteMail, JLabel label) {
    int unreadMess = p_compteMail.getUreadMessCount();
    if (unreadMess > 0) {
        label
                .setText(p_compteMail.getNomCompte() + " (" + unreadMess
                        + ")");
        label.setFont(Fontfactory.getTREE_FONT_GRAS());
    } else {
        label.setText(p_compteMail.getNomCompte());
        label.setFont(Fontfactory.getTREE_FONT_PLAIN());
    }
    label.setIcon(IconeTreeFactory.getDossierOuvert());

}

【问题讨论】:

  • 设置图标与否没有区别。抓住图标可能会。在您的代码中看起来真正可疑的是注释行:什么是 treeFactory 以及 refreshNode 对 treePath 做了什么?

标签: java swing jtree cellrenderer


【解决方案1】:

这可能不是问题;每当需要绘制单元格时,都会调用该方法。你没有控制它的奢侈。

所以把方法设计得非常高效,确保它没有副作用,你就没有问题了。

【讨论】:

  • 谢谢,但是如果我不使用我的自定义TreeCellRenderer,我的节点的折叠/扩展/选择很快,所以你认为是因为我使用了图像图标吗?有没有办法“说”该节点已经“装饰”?
  • +1,只是在吹毛求疵:不仅在绘制时:它也被调用以查询节点的大小以构建 LayoutCache
【解决方案2】:

我找到了一种方法来加快我的 jtree 的装饰, jtree 使用方法“toString()”来绘制节点,因此我在两种节点中覆盖了该方法,因此,在我的 customTreeCellRenderer 中,我只需在我的 userObject 上调用 toString 方法即可。 感谢您的帮助。

【讨论】:

    猜你喜欢
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多