首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从自定义呈现器获取方法getTreeCellRendererComponent中的getTreeCellRendererComponent节点文本

从自定义呈现器获取方法getTreeCellRendererComponent中的getTreeCellRendererComponent节点文本
EN

Stack Overflow用户
提问于 2015-10-01 13:48:56
回答 1查看 862关注 0票数 1

我正在自定义一个JTree,所以有些节点有复选框,使用santhosh tekuri的工作作为基础。

因此,我们的想法是编写一个自定义TreeCellRenderer,在本例中它扩展了JPanel并实现了TreeCellRenderer,然后在方法getTreeCellRendererComponent上,我必须决定每个节点是否收到复选框。

我已经看到了一些其他示例,用于典型的JTree自定义每个节点图标,但它们将每个节点转换为JLabel并获取其文本,而这里是一个JPanel。

我的渲染器是这样的:

代码语言:javascript
复制
public class CheckTreeCellRenderer extends JPanel implements TreeCellRenderer{

    private CheckTreeSelectionModel selectionModel;
    private TreeCellRenderer delegate;
    private TristateCheckBox checkBox;
    protected CheckTreeManager.CheckBoxCustomizer checkBoxCustomer;


    public CheckTreeCellRenderer(TreeCellRenderer delegate, CheckTreeSelectionModel selectionModel){
        this.delegate = delegate;
        this.selectionModel = selectionModel;
        this.checkBox = new TristateCheckBox("");
        this.checkBox.setOpaque(false);
        setLayout(new BorderLayout());
        setOpaque(false);
    }


    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus){
        Component renderer = delegate.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);

        // Inside this if clause, those cells which do not require checkbox will be returned
        if({CODE_TO_GET_NODE_TEXT}.startsWith("A")){
            return renderer;
        }

        TreePath path = tree.getPathForRow(row);
        if(path != null){
            if(checkBoxCustomer != null && !checkBoxCustomer.showCheckBox(path)){
                return renderer;
            }
            if(selectionModel.isPathSelected(path, selectionModel.isDigged())){
                checkBox.getTristateModel().setState(TristateState.SELECTED);
            }
            else{
                checkBox.getTristateModel().setState(selectionModel.isDigged() && selectionModel.isPartiallySelected(path) ? TristateState.INDETERMINATE : TristateState.DESELECTED);
            }
        }
        removeAll();
        add(checkBox, BorderLayout.WEST);
        add(renderer, BorderLayout.CENTER);

        return this;
    }
}

在这种情况下,我希望避免为以"A“开头的单元格设置Tristate复选框。但是我找不到从值参数中获取文本的方法。

如果有帮助,我就是这样创建JTree的:

代码语言:javascript
复制
DefaultMutableTreeNode root = new DefaultMutableTreeNode();
JTree tree = new JTree(root);

// Add nodes to the tree
DefaultMutableTreeNode friends_node = new DefaultMutableTreeNode("Friends");
    friends_node.add(new DefaultMutableTreeNode("Anna"));
    friends_node.add(new DefaultMutableTreeNode("Amador"));
    friends_node.add(new DefaultMutableTreeNode("Jonas"));
    friends_node.add(new DefaultMutableTreeNode("Mike"));
    friends_node.add(new DefaultMutableTreeNode("Anthony"));
    friends_node.add(new DefaultMutableTreeNode("Maya"));
    friends_node.add(new DefaultMutableTreeNode("Pepe Vinyuela"));
root.add(friends_node);

tree.setCellRenderer(renderer = new CheckTreeCellRenderer(tree.getCellRenderer(), new CheckTreeSelectionModel(tree.getModel(), dig)));

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-02 10:23:11

如果您使用的是String userObject = "Anna"; new DefaultMutableTreeNode(userObject);,那么您可能可以使用DefaultMutableTreeNode#getUserObject()方法:

代码语言:javascript
复制
@Override public Component getTreeCellRendererComponent(
    JTree tree, Object value, boolean selected, boolean expanded,
    boolean leaf, int row, boolean hasFocus) {
  Component renderer = delegate.getTreeCellRendererComponent(
    tree, value, selected, expanded, leaf, row, hasFocus);
  if (value instanceof DefaultMutableTreeNode) {
    Object userObject = ((DefaultMutableTreeNode) value).getUserObject();
    // Inside this if clause, those cells which do not require checkbox will be returned
    if(userObject instanceof String && ((String) userObject).startsWith("A")){
      return renderer;
    }
    //...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32889303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档